我有两个线程(A 和 B)+ 一个主线程(C)正在运行。线程 A 包含一个用于写入数据库的对象。有时线程 B 也想写入数据库。
据我了解,出于这个原因,我必须在线程 A 和 B 之间创建同步。如果我Synchronize
在线程 B 中使用方法,它将与主线程 C 同步,但不会与 A 同步。如何处理这种情况?
我有两个线程(A 和 B)+ 一个主线程(C)正在运行。线程 A 包含一个用于写入数据库的对象。有时线程 B 也想写入数据库。
据我了解,出于这个原因,我必须在线程 A 和 B 之间创建同步。如果我Synchronize
在线程 B 中使用方法,它将与主线程 C 同步,但不会与 A 同步。如何处理这种情况?
这最好集成到共享服务或资源中,这样两个线程就不需要相互了解。伪代码:
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;
无需打扰同步。
您可以使用临界区来防止同时访问内存。
使用某种线程间通信将消息从 B 发送到 A 以将数据写入 DB。这使数据库可以访问一个线程。确切的机制取决于线程 B 通常如何获取其输入(它是如何获得的?)。
对于数据库,除非您使用数据库会话,否则大多数数据库组件都不是线程安全的。通常最好给每个线程自己的数据库连接,而不是跨线程边界共享连接或组件。