リソースに記載されているように、ベーカリーアルゴリズムはデッドロックフリーとされています。 しかし、私が擬似コードを理解しようとしたとき、私は(私の知識によると)デッドロックを起こす可能性のあるラインを思いつきました。以下のコード、ロック中 ()関数にRefferingBakery Algorithm max()操作でデッドロックが発生する可能性はありますか?
、我々は言ってラインを持っている
ラベル[I] = MAX(ラベル[0]、...、ラベル[N-1] )+ 1;
2つのスレッドが同時に同じ状態になり、maxがアトミックでないため、2つのラベルが同じ値を持つことはありますか?
2つのラベルが同じ値であるため、そのラベルを持つ両方のスレッドは同時にクリティカルセクションへのアクセス権を取得します。デッドロックは起こりませんか?
ここで問題を説明することをお勧めします。まだ明確でない場合は、コメントしてください。ありがとう。
class Bakery implements Lock {
volatile boolean[] flag;
volatile Label[] label;
public Bakery (int n) {
flag = new boolean[n];
label = new Label[n];
for (int i = 0; i < n; i++) {
flag[i] = false; label[i] = 0;
}
public void lock() {
flag[i] = true;
label[i] =max(label[0], ...,label[n-1])+1;
while ($ k flag[k] && (label[i],i) > (label[k],k);
}
}
public void unlock() {
flag[i] = false;
}
はい、それは競合状態」ではない私の質問に「デッドロック」でなければなりません。 –