CSemaphore的使用

信號量是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告訴外面的人需要等待。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章