两个(不是主要的)线程同步

时间:2012-08-30 10:28:49

标签: multithreading delphi

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

正如我所理解的那样,我必须在线程A和B之间创建同步。如果我在线程B中使用Synchronize方法,它将与主线程C进行同步,但不与A进行同步。如何处理此问题情况?

4 个答案:

答案 0 :(得分: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;

没有打扰同步。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

相关问题