7

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686289%28v=vs.85%29.aspx

msdn によると、備考欄には次のように記載されています。の場合、スレッドを終了してもタイマーには影響しません。

さらに下には、「SetWaitableTimer を呼び出したスレッドが終了すると、タイマーはキャンセルされます。これにより、タイマーがシグナル状態に設定される前にタイマーが停止し、未処理の APC がキャンセルされます。タイマーのシグナル状態は変更されません。 "

したがって、私の質問は、関連付けられた完了ルーチンなしで SetWaitableTimer を呼び出す 1 つのスレッドと、WaitOnMultipleObjects (タイマー オブジェクト ハンドルを渡す) を呼び出す別のスレッドがあり、SetWaitiableTmer を呼び出すスレッドがその後すぐに終了する場合、タイマー オブジェクトは取り消されますか、それともそのままになりますか?期間の満了時に通知されますか?

4

2 に答える 2

3

ドキュメントはやや不明確です。自分で試してみるのが一番だと思います。ただし、I/O 完了ルーチンが使用されている場合にのみ、タイマーが自動的にキャンセルされると思います。

Windows APC に関する「理論的な」背景を説明して、(教育を受けた) 推測を正当化することができます。

APC = 「非同期プロシージャ コール」。Windows では、すべてのユーザー モード スレッドに、いわゆる APC キュー (このスレッドで呼び出す必要があるプロシージャのシステム管理キュー) が装備されています。スレッドは、いわゆる「アラート可能待機」状態に (意図的に) 入ることがあり、その間、このキュー内の 1 つ以上のプロシージャを実行することがあります。プロシージャ コールを手動で APC キューに配置するか、I/O を発行して、完了時にプロシージャ コールをそこに「配置」することができます。

簡単に言えば、シナリオは次のとおりです。いくつかの I/O を発行し、それらのいずれかが完了する (または失敗する) まで待機し、場合によっては他のイベントも待機します。次に、アラート可能な待機関数の 1 つを呼び出します:SleepExなどWaitForMultipleObjectsEx

重要な注意: このメカニズムは、シングルスレッドの同時実行をサポートするように設計されています。つまり、同じスレッドが複数の I/O を発行し、何かが起こるのを待って、適切に応答します。すべての APC ルーチンは、同じスレッドで呼び出されることが保証されています。したがって、このスレッドが終了した場合、それらを呼び出す方法はありません。したがって、すべての未処理の I/O も取り消されます。

ReadFileEx非同期 I/O を処理する Windows API 関数がいくつかありますが、これらの関数では、APC、イベントの設定、I/O 完了ポートへの完了の挿入など、いくつかの完了メカニズム ( など) を選択できます。これらの関数が APC で使用されている場合、発行スレッドが終了すると、自動的に I/O がキャンセルされます。

したがって、APCで使用した場合にのみ、待機可能なタイマーが自動キャンセルされると思います。

于 2012-06-16T17:06:39.243 に答える