http://msdn.microsoft.com/en-us/library/windows/desktop/ms686289%28v=vs.85%29.aspx
根据msdn,在注释部分,它说:“如果设置定时器的线程终止并且有一个关联的完成例程,定时器将被取消,但定时器的状态保持不变, 如果没有完成例程,那么终止线程对定时器没有影响。 “
然后进一步说:“ 如果调用SetWaitableTimer的线程退出,定时器将被取消,这会停止定时器,然后可以将其设置为已发信号状态并取消未完成的APC;它不会更改定时器的已发信号状态。 “
因此,我的问题是,如果我有一个线程调用SetWaitableTimer没有关联的完成例程,另一个线程调用WaitOnMultipleObjects(传递定时器对象句柄)和调用SetWaitiableTmer的线程此后不久,将取消定时器对象,或者它仍然会期限到期时发信号?
通用Windows应用程序中的后台任务中打开uri
语音识别和合成示例在物联网版本10.0.10586上部署时不起作用
在Windows上安装Haskell,cabalconfiguration
我怎样才能自动捕捉并重新启动Windows上的崩溃进程?
巧克力 – 这个软件包不支持64位体系结构
可以滥用RegisterWindowMessage导致资源耗尽?
我如何设置一个lua.dll,所以lua.exe不会在每个目录中要求它?
Windows中的Mercurial没有看到.hgignore – 为什么?
WampServer上的APC没有性能提升
文件有点不清楚。 我认为你能做的最好的就是自己测试一下。 但我相信,只有在使用I / O完成例程的情况下,定时器才会自动取消。
我可以给出一些有关Windows APC的“理论”背景,来证明我的(受过教育的)猜测。
APC =“异步程序调用”。 在Windows中,每个用户模式线程都有一个所谓的APC队列,一个系统管理的过程队列,必须在这个线程上调用。 线程可以进入所谓的“可警告的等待”状态(有意识的),在此期间它可以执行该队列中的一个或多个过程。 您可以手动将过程调用放入APC队列中,也可以发出I / O,完成后会将过程调用“放入”。
简而言之,情况如下:您发出多个I / O,然后您等待其中任一个完成(或失败),或者还有其他一些事件。 然后,您可以调用其中一个可警告等待函数: SleepEx , WaitForMultipleObjectsEx或类似的函数。
重要说明:此机制旨在支持单线程并发。 也就是说,同一个线程发出几个I / O,等待某些事情发生,并作出适当的响应。 所有的APC例程都保证在同一个线程中被调用。 因此 – 如果这个线程退出 – 没有办法打电话给他们。 因此 – 所有未完成的I / O也被取消 。
有几种处理异步I / O的Windows API函数,而它们允许选择多个完成机制(如ReadFileEx ):APC,设置事件或在I / O完成端口中完成一个完成。 如果这些函数与APC一起使用 – 如果发出线程退出,它们将自动取消I / O。
因此,我认为等待定时器只有与APC一起使用才能自动取消。
要直接从等待定时器的实现中获得更多信息:如果使用CompletionRoutine,定时器将放置在一个名为SetWaitableTimer的线程链接的链表上。 当线程终止时,内核遍历临终线程的链表,取消是仍然排队的定时器。
如果你没有使用完成例程,定时器永远不会被添加到任何线程的链表中,因此在任何特定线程死亡时不会被取消。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。