用 QueueUserAPC() 函数来强制线程退出等待状态

Windows操作系统在创建线程时会伴随一个异步过程调用(APC)队列。线程在调用如SleepEx()等特定函数进入等待状态时,若APC队列有任务,线程将不进入睡眠。QueueUserAPC函数允许我们将任务添加到指定线程的APC队列,从而不让线程进入睡眠,实现线程状态的强制退出。当线程处理APC队列中的任务时,WaitIOCompletion返回值表明线程因APC而唤醒。
摘要由CSDN通过智能技术生成

         当系统创建一个线程的时候,会同时创建一个与线程相关的队列。这个队列被成为异步过程调用(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

)


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值