我有兩個線程(A和B)+一個主線程(C)正在運行。線程A包含用於寫入數據庫的對象。有時線程B也想寫入數據庫。兩個(不是主線程)線程同步
因爲我理解爲這個原因,我必須在線程A和B之間創建同步。如果我在線程B中使用Synchronize
方法,它將與主線程C同步,但不會與A.如何處理這種情況?
我有兩個線程(A和B)+一個主線程(C)正在運行。線程A包含用於寫入數據庫的對象。有時線程B也想寫入數據庫。兩個(不是主線程)線程同步
因爲我理解爲這個原因,我必須在線程A和B之間創建同步。如果我在線程B中使用Synchronize
方法,它將與主線程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如何正常獲取其輸入,(它是如何?)。
說到數據庫,除非使用數據庫會話,否則大多數數據庫組件都不是線程安全的。將每個線程連接到數據庫通常會更好,而不是跨越線程邊界共享連接或組件。
使用序列化鎖。在Windows上,通常意味着一個臨界區對象。 –
嘗試過otl.17slon.com?他們有一個視圖線程間同步原語 –