05 信號量

1、事件(EVENT)

1550837890659

兩個線程都要修改全局變量,形成一個臨界區,有一個線程進入代碼,另一個線程是不能進入該代碼塊的,這是事件的特點。

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中找到所有線程,並從等待鏈表中摘掉

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章