1、事件(EVENT)
兩個線程都要修改全局變量,形成一個臨界區,有一個線程進入代碼,另一個線程是不能進入該代碼塊的,這是事件的特點。
2、信號量(SEMAPHORE)
信號量跟事件類似,但是區別在於它允許多個線程同時進入臨界區。
3、爲什麼要使用信號量
4、創建信號量
HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName);
kd> dt _KSEMAPHORE
ntdll!_KSEMAPHORE
+0x000 Header : _DISPATCHER_HEADER
+0x010 Limit : Int4B //lMaximumCount
kd> dt _DISPATCHER_HEADER
ntdll!_DISPATCHER_HEADER
+0x000 Type : UChar //信號類型爲5
+0x001 Absolute : UChar
+0x002 Size : UChar
+0x003 Inserted : UChar
+0x004 SignalState : Int4B //lInitialCount
+0x008 WaitListHead : _LIST_ENTRY
5、ReleaseSemaphore函數分析
ReleaseSemaphore–>NtReleaseSemaphore–>KeReleaseSemaphore
<1>設置SignalState = SignalState + N(參數)
<2>通過WaitListHead中找到所有線程,並從等待鏈表中摘掉