线程等待与唤醒之win32内核浅析 2021-11-10 操作系统内核 进程&线程 0 Comments 线程唤醒与等待等待对象 伪代码 解释 基于win32 等待对象 与 当前线程 ,被等待对象的关系. 12345678910111213141516171819202122232425262728//被等待对象1int Thread { int a = 0; return a++;}//被等待对象2int Thread1 { int a = 0; return a++;}//当前主线程 void main(...){ //被等待对象 int a Thead.t1.start; int a1 = Thead1.t1.start; 解析 -> 等待对象 waitingforSinglObject(arr[t1,t2],xx); 只有等待: 等待对象中的被等待对象t1和t2执行完后,当前main线程才能继续执行. printf(...);} 逻辑步骤-TODO1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859WaitForSingleObject调用内核函数NtWaitForObject,NtWaitForObject 调用ObReferenceObjectByHandle,通过当前线程对象句柄找到'等待对象结构体'的首地址将结构体首地址传递给 KeWaitSingleObjectKeWaitSingleObject 步骤:1,准备等待块._wait_block; 默认初始4个等待块 ..... 这块内核比较复杂黑盒,todo被等待对象:必须具备_DISPATCHER_HEADER属性的对象,_DISPATCHER_HEADER结构体{ ... ... +0x004 SingleStat; 信号状态 > 0; +0x008 WaitListHead; 所有等待块双向链表地址. }内部处理逻辑伪代码:while(1){ if(符合条件) // 1,符合超时条件, 等待对象的信号量 > 0; { 1,修改等待对象的singleStat; 2,退出循环 } else { if(不符合条件) // 超时并且被等待对象 !>0; { if(第一次执行) { } } } // 将waitingblockList 位置清0; //释放_kwait_block等待块内存.}