2 つのスレッド (A と B) + 1 つのメイン スレッド (C) が実行されています。スレッド A には、データベースへの書き込みに使用されるオブジェクトが含まれています。スレッド B もデータベースに書き込みたい場合があります。
この理由で私が理解したように、スレッド A と B の間で同期を作成する必要があります。Synchronizeスレッド B でメソッドを使用すると、メイン スレッド C と同期されますが、A とは同期されません。この状況に対処するにはどうすればよいですか?
2 つのスレッド (A と B) + 1 つのメイン スレッド (C) が実行されています。スレッド A には、データベースへの書き込みに使用されるオブジェクトが含まれています。スレッド B もデータベースに書き込みたい場合があります。
この理由で私が理解したように、スレッド A と B の間で同期を作成する必要があります。Synchronizeスレッド B でメソッドを使用すると、メイン スレッド C と同期されますが、A とは同期されません。この状況に対処するにはどうすればよいですか?
これは、両方のスレッドが互いを認識する必要がないように、共有サービスまたはリソースに統合するのが最適です。擬似コード:
uses
SyncObj;
TSomeService = class
private
FLock : TCriticalSection;
public
constructor Create;
destructor Destroy; override;
procedure UseService;
end;
constructor TSomeService.Create;
begin
FLock := TCriticalSection.Create;
end;
destructor TSomeService.Destroy;
begin
FreeAndNil (FLock);
end;
procedure TSomeService.UseService;
begin
FLock.Enter;
try
// ...
finally
FLock.Leave;
end;
これは両方のスレッドに対して完全に透過的であるため、両方のスレッドは単に呼び出すことができます
FSomeService.UseService;
同期を気にせずに。
クリティカル セクションを使用して、メモリへの同時アクセスを防ぐことができます。
ある種のスレッド間通信を使用して、B から A にメッセージを送信し、データを DB に書き込みます。これにより、DB アクセスが 1 つのスレッドに保持されます。正確なメカニズムは、スレッド B が通常どのように入力を取得するかによって異なります (どのように?)。
データベースに関しては、データベースセッションを使用しない限り、ほとんどのデータベースコンポーネントはスレッドセーフではありません。通常は、スレッドの境界を越えて接続やコンポーネントを共有せずに、代わりに各スレッドにデータベースへの独自の接続を与えることをお勧めします。