問題タブ [barrier]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Boost ライブラリがスレッド バリアの実装で m_generation 変数を使用するのはなぜですか?
ブースト ライブラリ (C++11 標準より前) は、スレッドのサポートを提供しました。サポートの一環として、同期を可能にする単純なクラスである「バリア」の実装も提供します。ブーストのウェブサイトを引用するには:
「バリアは単純な概念です。ランデブーとも呼ばれ、複数のスレッド間の同期ポイントです。バリアは、特定の数のスレッド (n) に対して構成され、スレッドがバリアに到達すると、n 個のスレッドすべてが待機する必要があります。 n 番目のスレッドがバリアに到達すると、待機中のすべてのスレッドが処理を続行できるようになり、バリアがリセットされます。」
Boost 1.54 の時点でのバリア (待機) のメイン関数の実装を以下に示します。
バリアは再利用可能であることがわかります。一度構築すると、最初の使用後に破壊する必要はありません。
私の質問は次のとおりです。変数 m_generation は何のためのものですか? ブーストライブラリの作成者には、それを含める理由があったと思います。バリアがリセットされる/再利用できるようになるたびにインクリメントされますが、その目的は何ですか? プライベート変数なので、外部から読み出せません。同じ問題は、プライベート クラス変数を使用せずに、wait() 関数内の単純な内部 bool 変数を使用して簡単に解決できます。
c - Cでスレッドバリアとバリアリセットを実装する正しい方法は何ですか?
次のような単純なバリアをコードに実装しようとしました。
そして、コードにはバリアの使用法があります。
ここまでは順調ですが、g_barrier変数をどこでゼロにリセットすればよいでしょうか? のようなものを書くと
waitOnBarrier呼び出しの直後に、スレッドの 1 つが他のスレッドよりも速くバリアから解放され、他のすべてのスレッドがまだループ命令を実行している間にg_barrierを無効にすると問題が発生するため、最終的にはバリアに永久にスタックします。 .
説明: waitOnBarrierは次のようなものにコンパイルされます (疑似コード):
したがって、バリアで同期している 2 つのスレッドがあり、thread_1が命令 3 または 4 のどこかで遅く、高速のthread_2がバリアに到達し、それを渡し、g_barrier無効化フローに進むとします。つまり、thread_1が命令 2 に到達した後、[barrier] でゼロの値が表示され、永久にバリアにスタックすることになります!
問題は、どのようにg_barrierを無効化する必要があるかということです。その時点までにすべてのスレッドがバリアを離れたことを確認できる「十分に」コード内のどこにあるのでしょうか。または、バリアを実装するより正しい方法はありますか?
multithreading - 同期バリアの実装
この Web サイトhttp://www.cs.cornell.edu/courses/cs4410/2010fa/synchreview.pdfでは、複数の反復に対するバリアの実装は次の方法で実装する必要があると述べています。
次のような単純な if-else ステートメントを使用した方が簡単ではないでしょうか。
余分な努力のすべてを理解していません。みんな、ありがとう。
multithreading - セマフォ ソリューションとのランデブーが一般化されないのはなぜですか (代わりにバリアを使用します)。
ランデブーの問題については、2 つのスレッドを同期する必要があります。これが古典的な解決策です。
スレッド A:
スレッド B:
これは 2 スレッドの場合はうまくいきますが、N スレッドの場合はどうでしょうか。N=3 の場合、次のように実装できます。
スレッド A (他のスレッドは対称):
私が見つけたすべての情報源は、次のように述べています。、または「以前に提示された解決策は、3 つ以上のスレッドでは機能しません。」.
(ちなみに、ここで提示された一般化されたソリューションは、N 個のスレッドに対して N 個のセマフォを使用するため、おそらく最適ではありません...このソリューションが N>2 スレッドで機能しないというシナリオを誰かが持っているかどうか知りたいです?)
python - Python 2.7 マルチプロセッシング バリア
私は Python 2.7 を使用しており、マルチスレッド コードをマルチプロセッシング コードに変換して、GIL ロックの問題を回避しています。ただし、 multiprocessing モジュールにバリアの実装が表示されません (実装方法はありますか?)。
私はこの質問を見ました: マルチプロセッシング.イベントを使用して、プロセスのプールの同期バリアを実装することは可能ですか? ただし、ロックを使用しないため、正しく機能するかどうかはわかりません。
ありがとう!
c - スレッドを使用して配列の最大値を見つけますか?
バイナリ セマフォを使用して実装されたバイナリ リダクションとバリアを使用して、c でこれを行うにはどうすればよいでしょうか? これは私がこれまでに持っているコードです。結界がなく、どう作ろうか迷っています。これにはミューテックスロックが必要ですか?
c - スレッドがバリアで永続的にブロックされている
さまざまなスレッド同期メカニズムを使用する割り当てに取り組んでいますが、頭痛の種は pthread_barrier_t だけです。
アイデアは、いくつかのスレッドのチェックポイントとしてバリアを実装することですが、それらは永続的にブロックされています。
ここでいくつかの回答を確認しましたが、実装は正しいようで、この単純なものを問題なくコンパイルして実行しました。
cpu.c (メインスレッドを含む):
units.c (他のスレッドの関数を含む):
いくつかのメモ:
- 私が参照している両方のファイルには、独自のヘッダーファイルがあります
- コードを短くするために、コードの一部を慎重に削除しました
- とにかく、関数本体はほとんど空です。バリアが機能するのを待っています
- コードを短く保つために、エラー チェックも削除されました (実行時にエラーは発生しません)。
- バリアカウントは、いくつかのスレッドの削除を反映しています
- バリアは cpu.h で拡張されます
ありがとう!