2

我有两个线程(A 和 B)+ 一个主线程(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。这使数据库可以访问一个线程。确切的机制取决于线程 B 通常如何获取其输入(它是如何获得的?)。

于 2012-08-30T10:58:10.810 回答
0

对于数据库,除非您使用数据库会话,否则大多数数据库组件都不是线程安全的。通常最好给每个线程自己的数据库连接,而不是跨线程边界共享连接或组件。

于 2012-08-30T15:08:50.657 回答