1、事件(EVENT)

05 信号量

两个线程都要修改全局变量,形成一个临界区,有一个线程进入代码,另一个线程是不能进入该代码块的,这是事件的特点。

2、信号量(SEMAPHORE)
05 信号量
信号量跟事件类似,但是区别在于它允许多个线程同时进入临界区。

3、为什么要使用信号量
05 信号量

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

相关文章:

猜你喜欢
  • 2021-06-13
  • 2022-12-23
  • 2022-02-01
  • 2022-01-11
  • 2022-12-23
  • 2021-12-26
相关资源
相似解决方案