WaitForSingleObject 的内部实现原理
来源:互联网 发布:p2p软件排行 编辑:程序博客网 时间:2024/05/23 12:50
WaitForSingleObject 是 kernel32.dll 的导出函数,WaitForSingleObject 调用了ntdll.dll 的 NtWaitForSingleObject.
NtWaitForSingleObject 又调用了 KeWaitForSingleObject
WaitForSingleObject -> NtWaitForSingleObject -> KeWaitForSingleObject
以下是KeWaitForSingleObject的部分实现代码。
{
WaitStatus = CurrentThread->WaitStatus;
CurrentThread->WaitBlockList = WaitBlock = &CurrentThread->WaitBlock[0];
CurrentObject = (PDISPATCHER_HEADER)Object;
if (KiIsObjectSignaled(CurrentObject, CurrentThread))
{
if (CurrentObject->SignalState != MINLONG)
{
KiSatisfyObjectWait(CurrentObject, CurrentThread);
Status = STATUS_WAIT_0;
goto WaitDone;
}
else
{
if (CurrentObject->Type == MutantObject)
{
KeReleaseDispatcherDatabaseLock(CurrentThread->WaitIrql);
ExRaiseStatus(STATUS_MUTANT_LIMIT_EXCEEDED);
}
}
}
WaitBlock->Object = CurrentObject;
WaitBlock->Thread = CurrentThread;
WaitBlock->WaitKey = (USHORT)(STATUS_WAIT_0);
WaitBlock->WaitType = WaitAny;
WaitBlock->NextWaitBlock = NULL;
KiCheckAlertability(Alertable, CurrentThread, WaitMode, &Status);
CurrentThread->WaitStatus = Status;
if (Timeout != NULL)
{
//略.有超时设置的情况
}
InsertTailList(&CurrentObject->WaitListHead, &WaitBlock->WaitListEntry);
if (CurrentThread->Queue)
{
DPRINT("Waking Queue/n");
KiWakeQueue(CurrentThread->Queue);
}
PsBlockThread(&Status, Alertable, WaitMode, (UCHAR)WaitReason);
if (Status != STATUS_KERNEL_APC)
{
return Status;
}
DPRINT("Looping Again/n");
CurrentThread->WaitIrql = KeAcquireDispatcherDatabaseLock();
}while (TRUE);
WaitDone:
- WaitForSingleObject 的内部实现原理
- SDWebImage的内部实现原理
- KVO内部的实现原理
- EventBus的内部实现原理
- hashMap的内部实现原理
- KVO的内部实现原理
- weak 的内部实现原理
- Block的内部实现原理
- C++中多态实现的内部原理
- StartActivity的内部代码实现原理
- 模拟hibernateTemplete的内部源代码实现原理
- HashMap的原理和内部实现机制
- iOS ---- KVO的内部实现原理
- iOS ---- KVO的内部实现原理
- deque内部实现原理
- hibernateTemplate内部实现原理
- HashMap内部实现原理
- Thrift内部实现原理
- 将C++对象导出到lua,C++和lua的相互调用
- TOMCAT类似iis主机头配置方法
- JavaScript类型检测小结-http://bbs.51js.com/viewthread.php?tid=82661
- 简评《平凡的世界》
- 创业失败的七大教训
- WaitForSingleObject 的内部实现原理
- RedHat linux AS 4 + Apache2.2 + Tomcat5.5.12
- 关于VC6.0自动关闭MessageBox的方法整理。
- Installation of the Robocup 3D simspark simulation server on Ubuntu
- 我也有博客了
- 格式化输出:%-+5d
- 自定义密码框
- jQuery表单常用操作
- 连接字符串