6.信号量
事件(EVENT)對象,線程在進入臨界區之前會通過調用 WaitForSingleObject或者WaitForMultipleObjects來判斷當前的事件對象是否有信號 (SignalState>0),只有當事件對象有信號時,才可以進入臨界區(只允許一個線程進入直到退出的一段代碼,不單指用EnterCriticalSection()和LeaveCriticalSection()而形成的臨界區)。
通過我們對EVENT對象相關函數的分析,我們發現, EVENT對象的SignalState值只有2種可能:
1 初始化時 或者調用 SetEvent
0 WaitForSingleObject. WaitForMultipleObjects, ResetEvent
為什么要使用信號量
比如說我們生產者線程里面加1,讓這5個消費者線程全部復活的話是沒有意義的,我們這個資源只有3份,我們只需要復活3條線程就行,這時就可以用信號量。
創建信號量對象
HANDLE CreateSemaphore (LPSECURITY ATTRIBUTES IpSemaphoreAttributes, //LONG IInitialCount,//允許幾條線程進入臨界區LONG IMaximumCount,//最大值是多少LPCTSTR IpName// )//windbg中查看信號量 kd> dt _ksemaphore nt!_KSEMAPHORE+0x000 Header : _DISPATCHER_HEADER+0x010 Limit : Int4B //IMaximumCount(參數3) kd> dt _DISPATCHER_HEADER nt!_DISPATCHER_HEADER+0x000 Type //信號量類型為5+0x001 Absolute+0x002 Size +0x003 Inserted+0x004 SignalState //IInitialCount(參數2)+0x008 WaitListHead釋放信號量
總結