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中找到所有线程,并从等待链表中摘掉