我有两个线程(A和B)+一个主线程(C)正在运行。线程A包含一个用于写入数据库的对象。有时线程B也想写入数据库。
正如我所理解的那样,我必须在线程A和B之间创建同步。如果我在线程B中使用Synchronize
方法,它将与主线程C进行同步,但不与A进行同步。如何处理此问题情况?
答案 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)
说到数据库,除非使用数据库会话,否则大多数数据库组件都不是线程安全的。通常最好是为每个线程提供与数据库自己的连接,而不是跨线程边界共享连接或组件。