2

私は無条件に 1 つのスレッド (スレッド A) で無限にスリープするマルチスレッド プログラムを持っています。別のスレッド (スレッド B) でイベントが発生すると、シグナルによってスレッド A をウェイクアップします。今、私はそれを行うには複数の方法があることを知っています. プログラムを Windows 環境で実行する場合、Thread-A で WaitForSingleObject を使用し、Thread-B で SetEvent を使用します。問題なく動作しています。ポーリング、選択を行うファイル記述子ベースのモデルを使用することもできます。それを行う方法は複数あります。ただし、最も効率的な方法を見つけようとしています。スレッド B が信号を送るたびに、できるだけ早くスレッド A をウェイクアップしたいと考えています。最良の選択肢は何だと思いますか。ドライバーベースのオプションを検討しても構いません。

ありがとう

4

1 に答える 1

2

前述のようにSetEvent、スレッド B でのトリガーとWaitForSingleObjectスレッド A でのトリガーは高速です。ただし、いくつかの条件を考慮する必要があります。

  • シングル コア/プロセッサ: マーティンが言うように、待機中のスレッドはシグナリング スレッドをプリエンプトします。このようなスキームでは、シグナルスレッド (B) が の直後にアイドル状態になるように注意する必要がありますSetEvent。これはsleep(0)、たとえば a によって行うことができます。

  • マルチコア/プロセッサ: 2 つのスレッドを異なるコア/プロセッサに配置する利点があると考える人もいるかもしれませんが、これはあまり良い考えではありません。両方のスレッドが同じコア/プロセッサ上にある場合、呼び出しSetEventから返されるまでの時間WaitForSingleObjectははるかに短くなります。

  • 1 つのコア ( SetThreadAffinityMask ) で両方のスレッドを処理すると、優先度設定 ( SetThreadPriority )によってそれらの動作を処理することもできます。待機中のスレッドをより高い優先度で実行するか、シグナル スレッドがイベントを設定した後に実際に何もしていないことを確認する必要があります。

  • 他の同期の問題に対処する必要があります。次のイベントはいつ発生しますか? スレッド A はタスクを完了しますか? この問題を解決するには、2 番目のイベントを使用するのが最も効果的です。スレッド A が完了すると、スレッド B がそのイベントを再度設定できることを示すイベントを設定します。スレッド B は効果的に最初にイベントを設定し、次にフィードバック イベントを待機します。これは、すぐにアイドル状態になるという要件を満たしています。

  • スレッド A が終了しておらず、まだ待機状態になっていない場合でも、スレッド B がイベントを設定できるようにする場合は、イベントの代わりにセマフォを使用することを検討する必要があります。このようにして、スレッド B からの「呼び出し/イベント」の数が保持され、スレッド A の待機関数がフォローアップできます。これは、セマフォが解放された回数が返されるためです。セマフォ オブジェクトは、イベントとほぼ同じ速さです。

概要:

  • を使用して、両方のスレッドを同じコア/CPU に配置しSetThreadAffinityMaskます。

  • SetEvent/WaitForSingleObjectを別のイベントで拡張して、を確立しHandshakeます。

  • 処理の詳細によっては、セマフォ オブジェクトも考慮する場合があります。

于 2012-08-01T13:41:46.940 に答える