간단한 로깅 클래스를 작성했으며 스레드로부터 안전한지 확인하고자합니다. 기본적으로 Log
, RegisterLogger
및 UnRegisterLogger
은 다른 스레드에서 호출됩니다. Log
은 많은 스레드에서 많이 호출되고 RegisterLogger
및 UnRegisterLogger
이라고 자주 호출됩니다.Delphi에서 TList <x> 스레드 안전성을 읽습니까?
기본적으로 내 질문은 다음과 같습니다. "TList<x>
은 스레드 안전합니까?"즉, 복수 스레드가 동시에 TList
에 액세스 할 수 있습니까?
IExecutionCounterLogger
이것이이 this question에서 계속 수행하고, (TExecutionCounterServer.Log
동일한 서명) 로그 방식과 인터페이스 좀더 배경
Type
TExecutionCounterServer = class
private
Loggers : TList<IExecutionCounterLogger>;
Synchronizer : TMultiReadExclusiveWriteSynchronizer;
public
procedure RegisterLogger(Logger : IExecutionCounterLogger);
procedure UnRegisterLogger(Logger : IExecutionCounterLogger);
procedure Log(const ClassName, MethodName : string; ExecutionTime_ms : integer);
constructor Create;
destructor Destroy; override;
end;
constructor TExecutionCounterServer.Create;
begin
Loggers := TList<IExecutionCounterLogger>.Create;
Synchronizer := TMultiReadExclusiveWriteSynchronizer.Create;
end;
destructor TExecutionCounterServer.Destroy;
begin
Loggers.Free;
Synchronizer.Free;
inherited;
end;
procedure TExecutionCounterServer.Log(const ClassName, MethodName: string; ExecutionTime_ms: integer);
var
Logger: IExecutionCounterLogger;
begin
Synchronizer.BeginRead;
try
for Logger in Loggers do
Logger.Log(ClassName, MethodName, ExecutionTime_ms);
finally
Synchronizer.EndRead;
end;
end;
procedure TExecutionCounterServer.RegisterLogger(Logger: IExecutionCounterLogger);
begin
Synchronizer.BeginWrite;
try
Loggers.Add(Logger);
finally
Synchronizer.EndWrite;
end;
end;
procedure TExecutionCounterServer.UnRegisterLogger(Logger: IExecutionCounterLogger);
var
i : integer;
begin
Synchronizer.BeginWrite;
try
i := Loggers.IndexOf(Logger);
if i = -1 then
raise Exception.Create('Logger not present');
Loggers.Delete(i);
finally
Synchronizer.EndWrite;
end;
end;
이다. 기본적으로 (DCOM) DataSnap 서버의 모든 메서드에 일부 계측을 추가했으며 모든 TDataSnapProvider OnGetData 및 OnUpdateData 이벤트에 연결했습니다.
동기화 기는 TMultiReadExclusiveWriteSynchronizer –
일 것입니다. Synchronizer를 사용하면 스레드 안전성이 보장됩니다 (전체 목적). 나는 앨리스터가 읽은 부분에 대해 그것을 생략하고 싶다고 이해했다. –
아니요, Alister는 여러 개의 "리더"가 동시에 실행될 때 TList 읽기가 올바르게 작동하는지 묻고있었습니다. –
gabr