私は手作りのスレッドプールを持っています。スレッドは完了ポートから読み取り、その他の処理を行います。1 つの特定のスレッドを終了する必要があります。GetQueuedCompletionStatus() または GetQueuedCompletionStatusEx() でハングした場合、待機を中断する方法は?
- 有限のタイムアウト (100 ~ 1000 ミリ秒) と変数の終了は、エレガントとはほど遠いものであり、遅延を引き起こし、最後の手段として残されています。
- ターゲット スレッドの APC 内の CancelIo(completionPortHandle) が原因
ERROR_INVALID_HANDLE
です。 - CancelSynchronousIo(completionPortHandle) が原因
ERROR_NOT_FOUND
です。 - 終了パケットを含む PostQueuedCompletionStatus() では、スレッドを選択できません。
- ミューテックスを使用した大まかな TerminateThread() は機能するはずです。(私はそれをテストしていません。)しかし、それはイデオロギー的に良いですか?
- 催事と完成ポートで待ち合わせしてみました。
WaitForMultipleObjects()
完了ポートが通知されたかのように、すぐに返されます。GetQueuedCompletionStatus()
ショーは何も返しませんでした。
Overlapped I/O: How to wake a thread on a completion port event or normal event?を読みました。そしてたくさんググった。
おそらく、スレッドの作業を終了するという問題自体は、設計が悪いことの兆候であり、すべてのスレッドが等しくなり、通常のスレッド プールに合成されるはずです。この場合、 PostQueuedCompletionStatus() アプローチが機能するはずです。(特に、スレッドが GetQueuedCompletionStatusEx() を使用して一度に複数のパケットを取得する場合、このアプローチが美しく簡潔であるとは思えませんが。)