問題タブ [cyclicbarrier]

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.

0 投票する
1 に答える
186 参照

java - CyclicBarrier から特定のスレッドを除外する

私の宿題は、チェス盤の上を数人のキングが移動するゲームを作らなければなりません。各キングは、独自のスレッドで独自の開始位置から一意の終了位置に移動する必要があります。キングは移動を行う前に、最大 10 ミリ秒 (多少のランダム性) スリープし、他のプレイヤーが移動するのを待つ必要があります。

私は王がお互いに動きをするのを待っているという問題を で解決しましたが、問題は王のCyclicBarrier1 人が自分の終了位置に到達して自分のスレッドを停止したときに発生します。次にCyclicBarrier、スレッドが await() メソッドを呼び出すのを待っていますが、スレッドが実行されていないため、それは決して起こりません。

助言がありますか?

0 投票する
3 に答える
451 参照

java - バリア崩し例

私は、Java Concurrency in Practiceという本を読んでいます。

CyclicBarrier一定数の当事者がバリアポイントで繰り返しランデブーできるようにし、問題を一定数の独立した部分問題に分解する並列反復アルゴリズムで役立ちます。

問題を複数の独立したサブ問題に分割する方法の例を誰かが挙げることができますか?

0 投票する
2 に答える
1413 参照

java - javaで特定のスレッドタイプのスレッドとセマフォを使用してサイクリックバリアを実装する

&&念のため、クラスセマフォはここにあります

これは、スレッドを使用してCyclicbarriersを実装するために作成したコードです。本から疑似コードとデッドロックに関するメモを取りましたので、「バグがあるかもしれませんが」大丈夫だと思います。最初のフェーズは「スレッドの到着」であり、2 番目のフェーズは「クリティカル領域でスレッドを一緒に実行する」ためのものです。私の質問は次のとおりです...特定のタイプのスレッドを考慮するためにコードを変更する方法は? たとえば、水素スレッドと酸素スレッドがあり、バリアに水素原子が 2 つと酸素原子が 1 つあるたびに bond() を実行する必要があります。前もって感謝します。

0 投票する
1 に答える
2774 参照

java - セマフォを使用してJavaでサイクリックバリアを実装する

問題は次のとおりです。バリアは down() を使用してのみ呼び出されるため、n 個のスレッドが到着するのを待ってから、重要な領域で n 個のスレッドすべてを一緒に実行するため、 barrier.downを呼び出しているスレッドにどのように通知すればよいでしょうか。それが今進むことができること。phase2( ) の後にnotifyAll()を追加しようとしましたが、うまくいきません。ヘルプ?:)

0 投票する
1 に答える
262 参照

multithreading - CyclicBarrier コードが機能しない?

もっと理解するために、オラクルページからCyclicBarrierコードを入手しました。私はそれを修正し、今1つの疑問があります。以下のコードは終了しませんが、Thread.sleep 条件のコメントを外すと、正常に動作します。

上記のコードで Thread.sleep が必要なのはなぜですか?

0 投票する
0 に答える
291 参照

multithreading - ハイブリッド セマフォ/サイクリック バリアが必要

現在、次のように機能するステージングジョブシステムに取り組んでいます(疑似コード):

これにより、ステージ内のすべてのジョブが次のステージに移る前に実行を終了します。

cyclicbarrier2 つのセマフォを使用して実装されます。

現在実行中のステージに 1 つ以上のジョブを追加できるジョブのサポートを追加し、ステージが続行する前にそれらのジョブも実行できるようにしたいと考えています。上記のコードはこれを行いますが、スレッドがバリアに到達した後にこのジョブが追加された場合、待機中のスレッドがジョブを実行している可能性があるのに実行していないため、最適に実行されません。

問題を要約すると、一種のハイブリッドsemaphore/が必要になりました。cyclicbarrier便宜上、これを と呼びますsembarrier。これがどのように機能するかは次のとおりです。

基本的に、これsembarrierは と同じように機能しますsemaphoreが、十分な数のスレッドが待機している場合、 のように動作し、cyclicbarrierそれらをすべて解放します。

を使用した新しい実装を次に示しsembarrierます。

sembarrierコンストラクターは次のようになります。

sembarrierステージごとに を作成します。

sembarrierこれは、配列を使用して変更されたループになります。

さらに、 に追加する場合joblist:

質問:

1) どうすれば効率的に実装できsembarrierますか? ミューテックスやセマフォなどの基本的な同時実行構造にアクセスできます。また、標準のアトミック操作もあります。

2) 元の問題に対する別の解決策はありますか?

ありがとう!

0 投票する
1 に答える
258 参照

java - CyclicBarrier での可視性の同期?

Javaでスレッドを同期するためにCyclicBarrierを使用する場合、非揮発性変数を同期しますか?

スレッド 1 の doSomeStuff 呼び出しで b が 3 に設定されていることを確認できますか? 試してみると、常に 3 です...

0 投票する
3 に答える
315 参照

java - Java でマルチスレッドを制御する

いくつかの「呼び出し可能な」スレッドを開始する「実行可能な」スレッドが 1 つあり、上記のすべてのスレッドがジョブを終了したときに結果を表示したいと考えています。

それを行う最良の方法は何ですか?

私のコードは次のとおりです

Connector.java (実行可能なスレッドの開始)

Traverse.java (Runnable Thread) ExecutorCompletionService を使用して処理していますが、違いはありませんでした。:(

Search.java (呼び出し可能スレッド)

0 投票する
1 に答える
913 参照

java - 循環バリアの再利用?

現在、マシンと通信するアプリケーションを実装しようとしていますが、基本的に次のように動作するはずです。

  • プログラムはサーバーにメッセージを送信します (この場合、ファイルの最初の 255 バイト)。
  • マシンは、「メッセージを正常に受信しました」または「メッセージを受信できませんでした」という応答で応答します。
  • 次に、プログラムは、マシンの応答に応じて、次のメッセージ (次の 255 バイト) を送信するかどうか (最後のメッセージのエラー、最初からやり直す必要がある) を決定する必要があります。
  • プログラムが送信する必要がある各メッセージについても同様です (ファイルのサイズによって異なります)。

そのため、送信を行うスレッドと受信を行う別のスレッドを用意することを考えました。これは、マシンからメッセージを受信するクラスとしてクラスを登録するための API (インターフェイスを実装するだけで) と、そのためのメソッドがあるためです。マシンへのメッセージ送信はブロッキング タイプではないため、応答が到着した後にプログラムが何をすべきかを決定できるように、マシンの応答を待つ方法が必要です。

したがって、これら 2 つのスレッドを何らかの形で同期させる必要がありました。交換するメッセージの数を特定できるため、CyclicBarrier を試す必要がありました。これは、CyclicBarrier がこの問題の解決に役立つかどうかをテストするためのコードです (プログラムは実際にはマシンとの通信にソケットを使用しません。これはバリアをテストするためだけのものです)。

メッセージを 1 つだけ送信した場合 (BlockingTest() コンストラクターで for ブロックを送信せず、メッセージを送信するだけ)、このコードは期待どおりに機能しますが、for ブロックを追加すると、期待どおりに機能しません。最初にのみ機能し、その後ハングします。

質問は次のとおりです。

  • バリアを再利用可能にする方法は?それは自動ですか、それとも手動で行う必要がありますか?

  • ソケット (またはバリア コー​​ド) で見逃したことが原因で、プログラムがハングしていませんか?