当系统创建一个线程的时候,会同时创建一个与线程相关的队列。这个队列被成为异步过程调用(APC)队列。同时我们也知道,windows提供了6个函数可以等待并将线程设置为可提醒状态---------
SleepEx(),
WaitForSingleObjectEx(),
WaitForMultipleObjectsEx(),
SignalObjectAndWait(),
GetQueuedCompletionStatusEx(),
MsgWaitForMultipleObjectsEx()
当我们调用这6个函数之一并将线程设置为可提醒状态的时候,系统会首先检查线程的APC队列。如果队列中至少有一项,那么系统不会让线程进入睡眠状态。
需要牢记:当带调用这些函数的时候,只要线程的APC队列中至少有一项,线程就不会进入睡眠状态。
这个6个函数的返回值也是很重要的:如果是WAIT_IO_COMPLETION,那么我们就知道线程得以运行的原因是线程至少处理了APC中的一项。
windows提供了一个函数,允许我们手动的添加一项到指定线程的APC队列中:
DWORD WINAPI QueueUserAPC(
__in PAPCFUNC pfnAPC,
__in HANDLE hThread,
__in ULONG_PTR dwData
)