2011-07-07 3 views
2

、私はスリープまたはWaitForSingleObject関数などの呼び出しがSleepExとWaitForSingleObjectExような彼らの警告可能なバージョンに使用されたブロックされた場所を変更しました。それから、QueueUserAPCでAPCをキューに入れることで待機を中断できます。戻り値がWAIT_IO_COMPLETIONの場合は、すべてのデストラクタが呼び出されてスレッドが終了する特別な例外がスローされます。これは、pthread_cancel()のLinux版と似ています。これにより、スタックが巻き戻され、スレッドが終了すると、クリーンアップされます。

NtWaitForKeyedEvent()にもAlertableパラメータがあることがわかります。このケースでも同じことができるかどうか、または警告があるのでしょうか? APCがこれを起こした場合、NTSTATUSはWIN32の戻りコードに直接対応していないため、どの戻り値を探すべきかもわかりません。 STATUS_USER_APCとSTATUS_ALERTEDがあり、その2つのどちらかになるかわかりません。ユーザのAPC機能が、キー付きイベント待機を警告するのに十分でない場合、何がありますか?NtWaitForKeyedEventがアラート可能ですか?私は、Windowsは、スレッドの中断をサポートするために<a href="http://locklessinc.com/articles/keyed_events/" rel="nofollow">http://locklessinc.com/articles/keyed_events/</a><br> <br> に触発され、カスタム同期プリミティブのためのイベントをキー使用しています

答えて

1

NtWaitForKeyedEvent Altertable = TRUEの場合は、あなたが望むことをするように見えます。それはNtWaitForSingleObjectで設定したパラメータで、APCの受信も可能にします。

STATUS_USER_APCは、APCが実行されて待機が完了した場合はSTATUS_ALERTEDとなります。NtAlertThreadがあなたのスレッドに関連して呼び出された場合。待つのを止める信号があれば、NtAlertThreadで十分です。

例外処理メカニズムでSEHの巻き戻しが行われる場合は、おそらくAPCルーチンから直接特殊例外をスローすることができます。

+0

これはうまくいくようです。私はいくつかのフラグの設定を行うことができるのでAPCを使用しているので、キャンセルがユーザ要求であるかどうかを確認することができます。私があまりよく分からないことの1つは、待機が中断されたがアラートが異なる場合の対処方法です。私は正しいことは、(それが使用されている場合は、適切に調整されたタイムアウトを使用して)待機を再開することだと思うが、おそらくNtReleaseKeyedEvent()を逃す機会がある場合は問題です。キー付きイベントAPIは、アラートのこの側面を何らかの形で説明していますか? –

関連する問題

 関連する問題