2012-06-16 23 views
6

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686289%28v=vs.85%29.aspx別のスレッドがタイマーで待機中にSetWaitableTimerを呼び出すスレッドが終了すると、タイマーはキャンセルされますか?

MSDNによると、発言のセクションでは、それは述べて: 「タイマーを設定するスレッドが終了し、関連する完了ルーチンがある場合、タイマーが取り消されたが、タイマー遺体の状態。そのまま何も完了ルーチンが存在しない場合、そしてスレッドを終了すると、タイマーには影響を与えません

はその後さらにダウン、それは述べて: 」。。SetWaitableTimer終了を呼び出したスレッドは、タイマーがキャンセルされた場合。これにより、タイマーがシグナル状態に設定され、未処理のAPCがキャンセルされる前にタイマーが停止します。タイマーのシグナル状態を変更しません。したがって

私の質問、 私は関連する完了ルーチンとWaitOnMultipleObjects(タイマーオブジェクトハンドルを渡し)そして、その後まもなくSetWaitiableTmer終了を呼び出すスレッドを呼び出す別のスレッドずにSetWaitableTimerを呼び出すスレッドを1つ持っている場合は、タイマーオブジェクトを希望キャンセルされるか、期限が切れたときにもそれが通知されますか?

答えて

3

ドキュメントは多少不明ですが、自分でテストすることができます。ルーチンが使用されます。

私はいくつかの "理論的な"バック私の(教育された)推測を正当化するために、窓APCについてのラウンド。

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

簡単な言い方をすれば、いくつかのI/Oを発行した後、いずれかのI/Oが完了(または失敗)するのを待っています。次に、警告可能な待機機能の1つ、SleepExWaitForMultipleObjectsExなどを呼び出します。

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

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

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

3

待機可能なタイマーの実装から直接的に詳細情報を提供する:CompletionRoutineを使用する場合、タイマーは、SetWaitableTimerを呼び出したスレッドから連鎖したリンクリストに配置されます。スレッドが終了すると、カーネルは死にかけているスレッドのリンクされたリストを歩き、キャンセルはまだキューに入れられているタイマーです。

完了ルーチンを使用していない場合、タイマーは決してスレッドのリンクリストに追加されないため、特定のスレッドが消滅したときにキャンセルされません。

関連する問題