http://msdn.microsoft.com/en-us/library/windows/desktop/ms686289%28v=vs.85%29.aspx
根据msdn,在备注部分,它声明:"如果设置定时器的线程终止并且有一个关联的完成例程,则定时器被取消.但是,定时器的状态保持不变.如果没有完成例程,然后终止线程对计时器没有影响. "
然后进一步向下,它指出:" 如果调用SetWaitableTimer的线程退出,则定时器被取消.这将使定时器停止,然后可以将其设置为信号状态并取消未完成的APC;它不会更改定时器的信号状态. "
因此,我的问题是,如果我有一个线程调用SetWaitableTimer而没有关联的完成例程,而另一个线程调用WaitOnMultipleObjects(传入定时器对象句柄)并且调用SetWaitiableTmer的线程此后不久退出,那么计时器对象是否会被取消或者它是否仍会变为在期限到期时发出信号?
文档有些不清楚。我认为你能做的最好的事情就是自己测试一下。但我相信只有使用 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 一起使用时,可等待计时器才会自动取消。