0

マルチスレッドプログラミングを学んでいます。ミューテックスを練習しているときに、デュアルコアのラップトップでは正しく動作しないように見えることに気付きました。

ミューテックス コードはhttp://pastebin.com/axGY5y3cにあります。

結果は以下のとおりです。

count value:t[0]1
count value:t[1]1
count value:t[2]2
count value:t[3]3
count value:t[4]4

結果は、スレッドが最初に同じ init 値を取得するように見えることを示しています。それは正しくないようです。

私のコードに何か問題がありますか? または、smp/dule-core/複数の CPU で Java ミューテックスを実行する例を提供するリソースはありますか?

手伝ってくれてありがとう。

4

3 に答える 3

1

私はミューテックスアルゴリズムにあまり精通していないので、並行性について厳密にあなたを助けることはできません。ただし、コード内で、リストした値を取得する理由を説明する1行を見つけました。

public class MyThread extends Thread{
    // [...]
    private static int count = 0;

4つのスレッドを開始すると、は4回呼び出され、各反復run()が増分されます。count

このコードブロック:

t[i].start();
int v = t[i].getCountValue();
System.out.println("count value:t["+i+"]"+v;

したがって、効果的に:

count++;
System.out.println("count value:t["+i+"]"+count);
于 2010-07-05T22:50:43.157 に答える
1

ポールが述べたように、「カウント」が静的であると宣言されているという混乱がありますが、それを取得すると、静的にしたくないことを暗示しています。基本的に、プログラムに何をさせたいかを決める必要があります。

しかし...いずれにせよ、他にも問題があります。

  • 実装では、スレッド間で共有されるデータ構造にアクセスしています (各スレッドには独自の配列要素がある場合がありますが、実際の配列参照はスレッド間で共有されます)。Java メモリ モデルによると、これを安全にするための手順を実行する必要があります (たとえば、配列をfinalまたはvolatileとして宣言するか、アトミック配列を使用します)。
  • 実際には実際にはより優れたパフォーマンスを発揮する(または少なくとも正確で柔軟な)標準の同時実行ライブラリがありますが、もちろん同時実行アルゴリズムを理解する学術的な演習としては悪いことではありません。
于 2010-07-05T23:52:46.410 に答える
0

私は自分のコードの問題を大まかに知っていると思います。Test.java の印刷された行には、lock (mutex.lock()/mutex.unlock()); の境界にない関数 getCountValue() が含まれています。したがって、スレッドがカウント値の出力を開始すると、競合状態が発生します。これは、カウントの値の出力が他のスレッドを待つ必要がないためです。

ロックの境界内にある run() 関数内に getCountValue() を移動した後。結果は正しく見えます。プリントアウトします

pid:0 count value:1
pid:2 count value:2
pid:3 count value:3
pid:1 count value:4
pid:4 count value:5

あなたのご親切に感謝します。それは有り難いです。

于 2010-07-11T07:51:39.267 に答える