線程是進程內一個相對獨立的、可調度的執行單元。一個應用可以有一個主線程,一個主線程可以有多個子線程,子線程還可以有自己的子線程,這樣就構成了多線程應用了。由於多個線程往往會同時訪問同一塊記憶體地區,頻繁的訪問這塊地區,將會增加產生線程衝突的機率。一旦產生了衝突,將會造成不可預料的結果(該公用地區的值是不可預料的)可見處理線程同步的必要性。
最近在做資料模組緩衝池中就需要用到線程同步的技術,也就順便用簡約的篇幅總結了Delphi中最常用的三種線程同步技術。
1.Critical Sections(臨界區)
代碼中如果有不能由兩個或兩個以上線程同時執行的部分,可以用臨界區來使這部分的代碼執行序列化。
它只能在一個獨立的進程或一個獨立的應用程式中使用。
使用方法如下:
//申明
var
oCSect: TCriticalSection; // 臨界區對象,保證多線程時存取資料模組的安全
//建立
oCSect := TCriticalSection.Create;
//進入臨界區
oCSect.Enter;
try
dosomething...//保護的代碼
finally
//離開臨界區
oCSect.Leave;
end;
//釋放臨界區
oCSect.Free;
2.Mutex(互斥對象)
是用於序列化訪問資源的全域對象。我們首先設定互斥對象,然後訪問資源,最後釋放互斥對象。在設定互斥對象時,如果另一個線程(或進程)試圖設定相同的互斥對象,該線程將會停下來,直到前一個線程(或進程)釋放該互斥對象為止。注意它可以由不同應用程式共用。
使用方法如下:
//申明
hMutex: HWND;
//建立
hMutex:=CreateMutex(nil,false,nil);
try
WaitForSingleObject(hMutex,INFINITE);
dosomething...//保護的代碼
finally
ReleaseMutex(hMutex);
end;
//銷毀
CloseHandle(hMutex)
3.Semaphore(訊號量)
它與互斥對象相似,但它可以計數。例如可以允許一個給定資源同時同時被三個線程訪問。其實Mutex就是最大計數為一的 Semaphore。
使用方法如下:
//申明
hSemaphore: THandle; // 並發許可數控制代碼
//建立號誌 建立對象時指定最大可同時訪問的線程數
//CreateSemaphore(lpSemaphoreAttributes As SECURITY_ATTRIBUTES,
// ByVal lInitialCount As Long, ByVal lMaximumCount As Long, ByVal lpName As String);
hSemaphore:= CreateSemaphore(nil,lInitialCount,lMaximumCount,lpName)
try
WaitForSingleObject(hSemaphore,INFINITE);
dosomething...//保護的代碼
finally
ReleaseSemaphore(hSemaphore, lReleaseCount, lpPreviousCount)
end;
//銷毀
CloseHandle(hSemaphore)
當開發多線程應用時,並且多個線程同時訪問一個共用資源或資料時,你是不是也該考慮線程同步的問題了?