1. 程式人生 > >執行緒同步--訊號量Semaphore

執行緒同步--訊號量Semaphore

訊號量Semaphore常用有三個函式,使用很方便。下面是這幾個函式的原型和使用說明。

第一個 CreateSemaphore

函式功能:建立訊號量

函式原型:

HANDLE
WINAPI
CreateSemaphoreW(
    __in_opt LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
    __in     LONG lInitialCount,
    __in     LONG lMaximumCount,
    __in_opt LPCWSTR lpName
    );

函式說明:

第一個引數表示安全控制,一般直接傳入NULL。

第二個引數表示初始資源數量。

第三個引數表示最大併發數量。

第四個引數表示訊號量的名稱,傳入NULL表示匿名訊號量。

第二個 OpenSemaphore

函式功能:開啟訊號量

函式原型:

HANDLE
WINAPI
OpenSemaphoreW(
    __in DWORD dwDesiredAccess,
    __in BOOL bInheritHandle,
    __in LPCWSTR lpName
    );

函式說明:

第一個引數表示訪問許可權,對一般傳入SEMAPHORE_ALL_ACCESS。詳細解釋可以檢視MSDN文件。

第二個引數表示訊號量控制代碼繼承性,一般傳入TRUE即可。

第三個引數表示名稱,不同程序中的各執行緒可以通過名稱來確保它們訪問同一個訊號量。

第三個 ReleaseSemaphore

函式功能:遞增訊號量的當前資源計數

函式原型:

BOOL
WINAPI
ReleaseSemaphore(
    __in      HANDLE hSemaphore,
    __in      LONG lReleaseCount,
    __out_opt LPLONG lpPreviousCount
    );

函式說明:

第一個引數是訊號量的控制代碼。

第二個引數表示增加個數,必須大於0且不超過最大資源數量。

第三個引數可以用來傳出先前的資源計數,設為NULL表示不需要傳出。

注意:當前資源數量大於0,表示訊號量處於觸發,等於0表示資源已經耗盡故訊號量處於末觸發。在對訊號量呼叫等待函式時,等待函式會檢查訊號量的當前資源計數,如果大於0(即訊號量處於觸發狀態),減1後返回讓呼叫執行緒繼續執行。一個執行緒可以多次呼叫等待函式來減小訊號量。 

最後一個 訊號量的清理與銷燬

由於訊號量是核心物件,因此使用CloseHandle()就可以完成清理與銷燬了。

有關訊號量Semaphore的總結:

訊號量也可以解決執行緒之間的同步問題。由於訊號量可以計算資源當前剩餘量並根據當前剩餘量與零比較來決定訊號量是處於觸發狀態或是未觸發狀態,因此訊號量的應用範圍相當廣泛。