Download presentation
Presentation is loading. Please wait.
Published byElisabeth Boyd Modified 5年之前
1
本节内容 SEMAPHORE 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
2
要点回顾 在上一节课我们讲到了事件(EVENT)对象,线程在进入临界区之前会通过调用WaitForSingleObject或者WaitForMultipleObjects来判断当前的事件对象是否有信号(SignalState>0),只有当事件对象有信号时,才可以进入临界区(只允许一个线程进入直到退出的一段代码,不单指用EnterCriticalSection() 和 LeaveCriticalSection() 而形成的临界区)。 通过我们对EVENT对象相关函数的分析,我们发现,EVENT对象的SignalState值只有2种可能: 1 初始化时 或者调用 SetEvent 0 WaitForSingleObject、WaitForMultipleObjects、ResetEvent
3
1、事件(EVENT)
4
2、信号量(SEMAPHORE)
5
3、为什么要使用信号量
7
关键循环: while(true)//每次线程被其他线程唤醒,都要进入这个循环 { if(符合激活条件)//1、超时 2、等待对象SignalState>0 //1) 修改SignalState //2) 退出循环 } else if(第一次执行) 将当前线程的等待块挂到等待对象的链表(WaitListHead)中; //将自己挂入等待队列(KiWaitListHead) //切换线程...再次获得CPU时,从这里开始执行 //1) 线程将自己+5C位置清0 //2) 释放_KWAIT_BLOCK所占内存
8
4、创建信号量对象 HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName ); _KSEMAPHORE +0x000 Header : _DISPATCHER_HEADER +0x010 Limit : Int4B //lMaximumCount _DISPATCHER_HEADER +0x000 Type //信号量类型为5 +0x001 Absolute +0x002 Size +0x003 Inserted +0x004 SignalState //lInitialCount +0x008 WaitListHead
9
5、ReleaseSemaphore函数分析
NtReleaseSemaphore KeReleaseSemaphore 1) 设置SignalState = SignalState + N(参数) 2) 通过WaitListHead找到所有线程,并从等待链表中摘掉。
10
课后练习: VIP会员可见
Similar presentations