2012-04-23 3 views
3

私はセマフォを使用してスレッドプロセスを作成しています。他のすべてのスレッドがクリティカルセクションを一定回数実行するまで、セマフォを使用してスレッドをブロックする

与えられたKがあれば、以前のすべてのスレッドが少なくともK-1回クリティカルセクションに入ったかどうかを確認できます。そうでなければ、現在のスレッドは、以前のスレッドがそうすることができるまでブロックする。

例:現在のスレッドがクリティカルセクションに入りたい場合、K = 3に設定した場合、すべての以前のスレッドがクリティカルセクションK-1(この場合は2回)に入ったかどうかを確認する必要がありますクリティカルセクションに入力してください

私はこれをJavaで実装できる方法を知っていますか?前もって感謝します。

+0

スレッドの数が事前に分かっていますか? – Gray

+0

これは 'K'のすべての値に当てはまりますか?したがって、スレッドを2回実行する前に、すべてのスレッドを一度実行する必要がありますか? – Gray

+0

はい、スレッドの数を任意に選択して – NuNu

答えて

6

Java 7を使用しており、Phaserを使用していることを確認してください。フェイザーは、K-1がフェーズになるボックスをこれで実現します。ここで

は一例です:

int waitForPhase = K-1; 
ExecutorService e = Executors.newFixedThreadPool(n); 
Phaser phaser = new Phaser(n); 
for(int i=0; i< n ;i++){ 
    e.submit(new Runnable(){ 
     public void run(){ 
      for(j =0 ;j < waitForPhase ; j++){ 
       //do work 
       phaser.arriveAndAwaitAdvance(); 
       // if you do not want all sub threads to wait for each 
       // this can also be phaser.arrive() 
      } 
     } 
    }); 
} 
phaser.awaitAdvance(waitForPhase); 

が始まるときにフェイザーでn登録の当事者となります。 1つのスレッドarriveAndAwaitAdvanceがすべてのスレッドがそのバリ​​アに到達するまで待機します。すべてのスレッドがそのバリ​​アに到達すると、フェーズが増加します。フェーズがK-1に達すると、呼び出しスレッドが壊れます。

phaser.awaitAdvance(waitForPhase);あなたの最後の文は、前のスレッドがそう

編集行うことが ことができたまで

現在のスレッドがブロックされる満たされた後:

awaitAdvance(int phase)は、現在のスレッドを中断しますがPhaserの現在のフェーズが引数として渡されるフェーズになるまですべてのスレッドが到着し、現在のスレッドで渡されたフェーズ番号への増分が起きるように通知されます。

+0

となります。 Phaserを使わずにそれをすることがあります。私は以前にフェイザーを使用していませんでしたので、あまりよく知らないので – NuNu

+0

あなたはサイクリック・バリアーを使うことができますが、自分自身で「フェーズ」をコントロールする必要があります。 –

+0

phaser.awaitAdvance(waitForPhase)に関する質問:そのスレッドがスレッドを解放しているか、それとも何を意味するのか – NuNu

関連する問題