在windows下:
信號量(Semaphore)內核對象對線程的同步方式,它允許多個線程在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大線程數目。
CreateSemaphore()
OpenSemaphore()
ReleaseSemaphore(),
WaitForSingleObject()/WaitForMultipleObjects()
CreateSemaphore()創建信號量時即要同時指出允許的最大資源計數和當前可用資源計數。
一般是將當前可用資源計數設置為最大資源計數,
每增加一個線程對共享資源的訪問,當前可用資源計數就會減1,
只要當前可用資源計數是大于0的,就可以發出信號量信號。
但是當前可用計數減小到0時則說明當前占用資源的線程數已經達到了所允許的最大數目,不能在允許其他線程的進入,此時的信號量信號將無法發出。
線程在處理完共享資源后,應在離開的同時通過ReleaseSemaphore()函數將當前可用資源計數加1。在任何時候當前可用資源計數決不可能大于最大資源計數。
說明如下:
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // 安全屬性指針
LONG lInitialCount, // 初始計數
LONG lMaximumCount, // 最大計數, 定義了允許的最大資源計數
LPCTSTR lpName // 對象名指針, 創建的信號量定義一個名字,其創建的是一個內核對象,因此在其他進程中可以通過該名字而得到此信號量
);
OpenSemaphore()函數即可用來根據信號量名打開在其他進程中創建的信號量,函數原型如下:
HANDLE OpenSemaphore(
DWORD dwDesiredAccess, // 訪問標志
BOOL bInheritHandle, // 繼承標志
LPCTSTR lpName // 信號量名
);
在線程離開對共享資源的處理時,通過ReleaseSemaphore()來增加當前可用資源計數。否則將會出現當前正在處理共享資源的實際線程數并沒有達到要限制的數值,
而其他線程卻因為當前可用資源計數為0而仍無法進入的情況。
BOOL ReleaseSemaphore(
HANDLE hSemaphore, // 信號量句柄
LONG lReleaseCount, // 計數遞增數量
LPLONG lpPreviousCount // 先前計數,可以設置為NULL,
);
該函數將lReleaseCount中的值添加給信號量的當前資源計數,一般將lReleaseCount設置為1,
WaitForSingleObject和WaitForMultipleObjects主要用在試圖進入共享資源的線程函數入口處,
主要用來判斷信號量的當前可用資源計數是否允許本線程的進入。
只有在當前可用資源計數值大于0時,被監視的信號量內核對象才會得到通知。