TThreadList
과 같은 방식으로 TMultiReadExclusiveWriteSynchronizer
과 TList
을 조합하면됩니다. 이 수업의 작동 방식을 이미 알고 있다면 아래 코드를 따라갈 수 있습니다.
type
TReadOnlyList = class
private
FList: TList;
function GetCount: Integer;
function GetItem(Index: Integer): Pointer;
public
constructor Create(List: TList);
property Count: Integer read GetCount;
property Items[Index: Integer]: Pointer read GetItem;
end;
TMREWList = class
private
FList: TList;
FReadOnlyList: TReadOnlyList;
FLock: TMultiReadExclusiveWriteSynchronizer;
public
constructor Create;
destructor Destroy; override;
function LockListWrite: TList;
procedure UnlockListWrite;
function LockListRead: TReadOnlyList;
procedure UnlockListRead;
end;
{ TReadOnlyList }
constructor TReadOnlyList.Create(List: TList);
begin
inherited Create;
FList := List;
end;
function TReadOnlyList.GetCount: Integer;
begin
Result := FList.Count;
end;
function TReadOnlyList.GetItem(Index: Integer): Pointer;
begin
Result := FList[Index];
end;
{ TMREWList }
constructor TMREWList.Create;
begin
inherited;
FList := TList.Create;
FReadOnlyList := TReadOnlyList.Create(FList);
FLock := TMultiReadExclusiveWriteSynchronizer.Create;
end;
destructor TMREWList.Destroy;
begin
FLock.Free;
FReadOnlyList.Free;
FList.Free;
inherited;
end;
function TMREWList.LockListWrite: TList;
begin
FLock.BeginWrite;
Result := FList;
end;
procedure TMREWList.UnlockListWrite;
begin
FLock.EndWrite;
end;
function TMREWList.LockListRead: TReadOnlyList;
begin
FLock.BeginRead;
Result := FReadOnlyList;
end;
procedure TMREWList.UnlockListRead;
begin
FLock.EndRead;
end;
이것은 가능한 가장 기본적인 구현입니다. 원한다면 TThreadList
의 방식으로 더 많은 종소리와 휘파람을 더할 수 있습니다.
가능한 [Delphi MREW 구현은 독자에게 호의적입니까?] (http://stackoverflow.com/questions/1742915/delphi-mrew-implementation-that-favors-readers) –
당신이 이해할 수 없다, 나는 TList가 필요하다. MREW 기능을 가진 사용자는 동일한 질문이 아닙니다. TThreadList가 있지만 잠금을 모두 해제하면 잠금이 제거 될 때까지 읽기가 불가능합니다. – NevTon
'TMultiReadExclusiveWriteSynchronizer'는 싱크로 객체입니다. 연결된 컨테이너가 없습니다. 너 혼자 그렇게해야 해. 그렇게하는 것은 매우 쉽습니다. 시도해 봤어? –