Multithreading 两个(非主)线程同步

Multithreading 两个(非主)线程同步,multithreading,delphi,Multithreading,Delphi,我有两个线程(A和B)+一个主线程(C)在运行。线程A包含一个用于写入数据库的对象。有时线程B也希望写入数据库 据我所知,出于这个原因,我必须在线程A和线程B之间创建同步。如果我在线程B中使用Synchronize方法,它将与主线程C进行同步,但不包括A。如何处理这种情况?您可以使用关键部分来防止同时访问内存。使用某种线程间通信将消息从B发送到A,以将数据写入数据库。这使DB可以访问一个线程。确切的机制取决于线程B通常如何获取其输入(它是如何获取的?)这最好集成到共享服务或资源中,这样两个线程就

我有两个线程(A和B)+一个主线程(C)在运行。线程A包含一个用于写入数据库的对象。有时线程B也希望写入数据库


据我所知,出于这个原因,我必须在线程A和线程B之间创建同步。如果我在线程B中使用
Synchronize
方法,它将与主线程C进行同步,但不包括A。如何处理这种情况?

您可以使用关键部分来防止同时访问内存。

使用某种线程间通信将消息从B发送到A,以将数据写入数据库。这使DB可以访问一个线程。确切的机制取决于线程B通常如何获取其输入(它是如何获取的?)

这最好集成到共享服务或资源中,这样两个线程就不需要相互了解。伪代码:

uses
  SyncObj;


这对两个线程都是完全透明的,因此两个线程都可以调用

FSomeService.UseService;

不必担心同步。

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

使用序列化锁。在Windows上,这通常意味着临界截面object.otl.17slon.com?它们具有查看线程到线程同步原语的功能
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;