一般的な変数にアクセスするためにスレッドを同期させたい。 私はN個のスレッドを持ち、それぞれがTSyncThreds型の変数のグローバルインスタンスにアクセスできるとします。TCriticalSectionは変数へのマルチスレッドアクセスを許可しますか?
IncCount、DecCountメソッドを呼び出すことはできますか?または、オブジェクトの同じインスタンスにアクセスする同時スレッドに問題がありますか?
私はちょうどFCcounter変数へのアクセスをシンクロ...
type
TSyncThreads = class
public
FCounterGuard: TCriticalSection;
FCounter: integer;
FSimpleEvent: TSimpleEvent;
constructor Create();
procedure Wait();
procedure IncCounter();
procedure DecCounter();
end;
var
SyncThread: TSyncThreads;
implementation
uses
Math, Windows, Dialogs;
{ TSyncThreads }
procedure TSyncThreads.DecCounter;
begin
FCounterGuard.Acquire;
Dec(FCounter);
if FCounter = 0 then
FSimpleEvent.SetEvent;
FCounterGuard.Release;
end;
procedure TSyncThreads.IncCounter;
begin
FCounterGuard.Acquire;
Inc(FCounter);
FCounterGuard.Release;
end;
constructor TSyncThreads.Create();
begin
FCounter := 0;
FSimpleEvent := TSimpleEvent.Create;
FCounterGuard := TCriticalSection.Create;
FSimpleEvent.ResetEvent;
end;
procedure TSyncThreads.Wait;
var
ret: TWaitResult;
begin
ret := FSimpleEvent.WaitFor(INFINITE);
end;
クリティカルセクションを保持している間に何か問題が発生した場合にReleaseが呼び出されるように、try/finallyブロックでAcquure/Releaseの呼び出しをラップする必要があります。さもなければ、それは決して解放されることができず、獲得するのを待っているものであればブロックされません。 –