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