unit SynReadWrite;
interface
uses
Windows, Classes, SysUtils, NJaContainers;
type
TSynReadWrite = class(TObject)
private
FCurReadCount: Integer;
FLock: TSyncObject;
FEvent: THandle;
public
constructor Create;
destructor Destroy; override;
procedure ReadLock;
procedure ReadUnlock;
procedure WriteLock;
procedure WriteUnlock;
end;
implementation
{ TSynReadWrite }
constructor TSynReadWrite.Create;
begin
inherited;
FCurReadCount := 0;
FLock := TSyncObject.Create;
FLock.ThreadSafe := True;
// 手动Reset,即Wait完毕不自动Reset,默认状态:set
FEvent := CreateEvent(nil, True, True, nil);
end;
destructor TSynReadWrite.Destroy;
begin
CloseHandle(FEvent);
FreeAndNil(FLock);
inherited;
end;
procedure TSynReadWrite.ReadLock;
begin
FLock.Lock;
InterlockedIncrement(FCurReadCount);
FLock.Unlock;
end;
procedure TSynReadWrite.ReadUnlock;
begin
// 通知读完毕
if InterlockedDecrement(FCurReadCount) = 0 then
SetEvent(FEvent);
end;
procedure TSynReadWrite.WriteLock;
var
LCurCount: Integer;
begin
// 让读写都不能再进入
FLock.Lock;
// 事件:要等待读完毕
ResetEvent(FEvent);
LCurCount := FCurReadCount;
if LCurCount > 0 then
begin
// 有正在读取的
WaitForSingleObject(FEvent, INFINITE);
end;
end;
procedure TSynReadWrite.WriteUnlock;
begin
FLock.Unlock;
end;
end.
标签:begin,end,读写,TSynReadWrite,FLock,FEvent,procedure From: https://blog.51cto.com/u_16076050/6195818