无论可等待对象是何种类型,线程都是通过:
WaitForSingleObject
WaitForMultipleObjects
进入等待状态的,这两个函数是理解线程等待与唤醒进制的核心
WaitForSingleObject参数说明
WaitForSingleObject对应的内核函数:
NTSTATUS stdcall NtWaitForSingleObject
(
HANDLE Handle,
BOOLEAN Alertable,
PLARGE_INTEGER Timeout
)
Handle 用户层传递的等待对象的句柄 (具体细节参加句柄表专题)
Alertable 对应 KTHREAD 结构体的 Alertable 属性如果为1在插入用户APC时,该线程将被吵醒
Timeout 超时时间
NtWaitForSingleObject
- 调用ObReferenceObjectByHandle函数,通过对象句柄找到等待对象结构体地址。
- 调用KeWaitForSingleObject函数,进入关键循环。