2

私は手作りのスレッドプールを持っています。スレッドは完了ポートから読み取り、その他の処理を行います。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() を使用して一度に複数のパケットを取得する場合、このアプローチが美しく簡潔であるとは思えませんが。)

4

2 に答える 2