2

2 つのスレッド (A と B) + 1 つのメイン スレッド (C) が実行されています。スレッド A には、データベースへの書き込みに使用されるオブジェクトが含まれています。スレッド B もデータベースに書き込みたい場合があります。

この理由で私が理解したように、スレッド A と B の間で同期を作成する必要があります。Synchronizeスレッド B でメソッドを使用すると、メイン スレッド C と同期されますが、A とは同期されません。この状況に対処するにはどうすればよいですか?

4

4 に答える 4

8

これは、両方のスレッドが互いを認識する必要がないように、共有サービスまたはリソースに統合するのが最適です。擬似コード:

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;

同期を気にせずに。

于 2012-08-30T13:45:03.363 に答える
2

クリティカル セクションを使用して、メモリへの同時アクセスを防ぐことができます。

于 2012-08-30T10:33:50.193 に答える
1

ある種のスレッド間通信を使用して、B から A にメッセージを送信し、データを DB に書き込みます。これにより、DB アクセスが 1 つのスレッドに保持されます。正確なメカニズムは、スレッド B が通常どのように入力を取得するかによって異なります (どのように?)。

于 2012-08-30T10:58:10.810 に答える
0

データベースに関しては、データベースセッションを使用しない限り、ほとんどのデータベースコンポーネントはスレッドセーフではありません。通常は、スレッドの境界を越えて接続やコンポーネントを共有せずに、代わりに各スレッドにデータベースへの独自の接続を与えることをお勧めします。

于 2012-08-30T15:08:50.657 に答える