1

msdnAutoResetEvent

質問

AutoResetEventの周囲に最適な並列パターンはどれですか?

バックグラウンド

スレッド間の同期のオプションを比較する場合、と比較する場合がありAutoResetEventますManualResetEvent。次の2つの違いを考慮してください。

  1. AutoResetEventは、最大で1つの待機中のスレッドを解放します。
  2. AutoResetEventは、待機中の1つのスレッドが解放された後に自動的にリセットされます。

AutoResetEvent2つのスレッドが待機していて、 2回発火した場合、競合状態が発生し、1つのスレッドのみが解放される可能性があることに注意することが重要です。この状態から保護するために、より多くのロックを使用できますが、質問の焦点は、どのパターンAutoResetEventが最適であるか(そして、おそらくこれは、どのパターンがそれ自体で最適にサポートされるかを意味します)についてです。

4

1 に答える 1

0

この場合、並列パターンについて話すことができるかどうかはわかりません。パターンは、などの単なる同期メカニズムよりもはるかに高いレベルの抽象化にありAutoResetEventます。

並列パターンについて話すときは、データ構造の幾何学的分解、並列分割統治、プロデューサー-コンシューマーなどの一般的な並列処理の問題を解決する一般的な方法を指します。レベルのメカニズムであり、言語やプラットフォームに依存しません。

AutoResetEvent.NET同期メカニズムです。クラスと一緒に使用して、具体的なケースThreadで上記のパターンの1つを実装できますが、この実装は、たとえばpthreadや条件変数に置き換えることができます。

並列処理の問題を解決するときに物事を見るように教えられた方法は、抽象から具体まで、次の3つのステップに沿っていました。

  1. 該当する並列パターンを特定する
  2. パターンを実装するための適切なアルゴリズムを特定します
  3. アルゴリズムを実装するための適切な低レベルのメカニズムを特定する

編集:わかりました。古い「もの」を調べた後、を使用して実装できるパターンを特定しましたAutoResetEvent。問題の良い説明については、ここで私の古い質問をチェックしてください:並列アプリケーションはランダムな動作をします

説明からわかるように、割り当てられた行の計算を開始する前に、各スレッドは、コンパニオンスレッドが前の行の少なくとも最初のいくつかの項目を処理するのを待つ必要があります。つまり、各スレッドは、割り当てられた各行の先頭でブロックし、シグナルを待つ必要があります。したがって、マトリックスを処理する3つのスレッドがあるとすると、スレッド0は行0、3、6 ...の先頭でブロックされます。スレッド1は行1、4、7...などでブロックされます。

各スレッドは数回ブロックする必要があるため、この通知待ちの動作はスレッドごとに簡単に実装できますAutoResetEvent。つまり、イベントを数回リセットする必要があり、シーケンスですぐに通知される危険はありません。スレッドは互いに進むのを待つ必要があります。

于 2012-07-06T19:33:44.480 に答える