原理: 读读相容,读写互斥,写写互斥。

 在第一读线程获取数据锁,在完成读的最后一个线程释放数据锁,由于获取和释放可能在不同线程,需要使用事件或信号量。

 

用delphi写了一个简单的读写锁 

 

 

 TReadWriteLock = class(TObject)
  private
    FReadCount: Integer;
    FReadCountLock: TCriticalSection;
    FDataLock: THandle;
  public
    constructor Create;
    destructor Destroy; override;
    function AcquireReadLock: Boolean;
    function ReleaseReadLock: Boolean;
    function AcquireWriteLock: Boolean;
    function ReleaseWriteLock: Boolean;
  end;
implementation
{ TReadWriteLock }
function TReadWriteLock.AcquireWriteLock: Boolean;
begin
  if WAIT_OBJECT_0 = WaitForSingleObject(FDataLock, INFINITE)  then  Result := True
  else Result := False;
end;
constructor TReadWriteLock.Create;
begin
  FReadCountLock := TCriticalSection.Create;
  FDataLock := CreateSemaphore(nil, 1, 1, '');
end;
destructor TReadWriteLock.Destroy;
begin
  FreeAndNil(FReadCountLock);
  CloseHandle(FDataLock);
  inherited;
end;
function TReadWriteLock.GetReadCount: Integer;
begin
  Result := FReadCount;
end;
function TReadWriteLock.ReleaseReadLock: Boolean;
begin
  Result := False;
  FReadCountLock.Acquire;
  try
    Dec(FReadCount);
    if FReadCount = 0 then Result := ReleaseSemaphore(FDataLock, 1, nil);
  finally
    FReadCountLock.Release;
  end;
end;
function TReadWriteLock.AcquireReadLock: Boolean;
begin
  Result := False;
  FReadCountLock.Acquire;
  try
    if FReadCount = 0 then
      if WAIT_OBJECT_0 = WaitForSingleObject(FDataLock, INFINITE)  then  Result := True;
    Inc(FReadCount);  
  finally
    FReadCountLock.Release;
  end;
end;
posted on 2011-11-15 20:38  Cabic  阅读(503)  评论(0)    收藏  举报