原理: 读读相容,读写互斥,写写互斥。
在第一读线程获取数据锁,在完成读的最后一个线程释放数据锁,由于获取和释放可能在不同线程,需要使用事件或信号量。
用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;
浙公网安备 33010602011771号