2012-08-30 32 views
2

我有兩個線程(A和B)+一個主線程(C)正在運行。線程A包含用於寫入數據庫的對象。有時線程B也想寫入數據庫。兩個(不是主線程)線程同步

因爲我理解爲這個原因,我必須在線程A和B之間創建同步。如果我在線程B中使用Synchronize方法,它將與主線程C同步,但不會與A.如何處理這種情況?

+1

使用序列化鎖。在Windows上,通常意味着一個臨界區對象。 –

+0

嘗試過otl.17slon.com?他們有一個視圖線程間同步原語 –

回答

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; 

而不同步困擾。

2

您可以使用關鍵部分來防止同時訪問內存。

1

使用某種類型的線程間通信通知B到A的消息將數據寫入數據庫。這使得DB訪問一個線程。確切的機制取決於線程B如何正常獲取其輸入,(它是如何?)。

0

說到數據庫,除非使用數據庫會話,否則大多數數據庫組件都不是線程安全的。將每個線程連接到數據庫通常會更好,而不是跨越線程邊界共享連接或組件。