信號量是CSemaphore的對象,它允許有限數目的線程在一個或多個進程中訪問同一個資源,從而實現多線程之間的同步。一個CSemaphore對象保持了對當前訪問某一指定資源的線程的計數。。
CSemaphore類的構造函數原型如下:
CSemaphore(
LONG lInitialCount /* = 1*/, //計數器的初始值
LONG lMaxCount /* = 1*/, //計數器的最大計數值
LPCTSTR pstrName/* =NULL*/, //信號的名稱
LPSECURITY_ATTRIBUTESlpsaAttributes /* = NULL */ //指向一個SECURITY_ATTRIBUTES結構的指針
)
信號量對象中有一個可以設置初值的計數器,每當一個線程使用資源時,在該線程中就調用信號計數器對象的成員函數Lock()將該計數器的值減一,當計數器爲0時,就不再允許其他線程訪問該資源;而當一個線程使用信號量對象的成員函數Unlock()釋放資源時,可以將計數器的值加一。因此,信號量對象允許多個線程訪問同一個資源,但同時訪問該資源的線程總數不能超過信號量對象的最大計數值。
做一個形象的比喻:Semaphore是一間可以容納N人的房間,如果人不滿就可以進去,如果人滿了,就要等待有人出來。
如果房間裏有人出來通過ReleaseSemaphore告訴其他人有空間可以進入,如果房間已滿通過WaitForSingleObject告訴外面的人需要等待。