2011-12-10 7 views
1

http://en.wikipedia.org/wiki/Lamport%27s_bakery_algorithmベーカリーアルゴリズム(デッドロック?)

私はこのアルゴリズムを理解するためにいくつかの問題を抱えています。現在のスレッドとスレッド、私はforループの瞬間を見ている場合はどうなります同じですか?

スレッド:0、1、2

スレッド1は、チケット1スレッド2は、チケット2スレッド0は何もしませんとりかかります。

アレイ= iは0、1、2

ラウンド1:

  • スレッド1(J = 0):配列[0] = 0次回。
  • スレッド2(j = 0):配列[0] = 0です。

ラウンド2:

  • スレッド1(j = 1):配列[1] = 1(1,1)>(1,1)
  • スレッド2(J = 1 ):配列[1] = 1.(1,1)>(2,2)

(1,1)>(1,1)間違っています。 (1,1)>(2,2)間違っています。

両方のスレッドが待機しています...

何が問題なのですか。これはデッドロックですか?

+1

この意味は、(1,1)>(1,1)? –

+0

(a、b)< (a user1091344

答えて

2

アルゴリズムでwhileループを使用すると、不等式がでなければが成り立つときにクリティカルセクションに入ることができます。それは言う:(番号[i]は、i)は真である& &((番号[j]は、j)は<限り、条件(!ナンバー[J] = 0)として待つ

ので(1,1。 )は、スレッド1がループを通過してクリティカルセクションに入ることができる(1,1)よりも大きくない。

+0

私はそれを得ましたが、 "await((number [j] = 0) whileループではなく、(number [j]、j)>(number [i]、i)) "と同じですか?私はそれを理解することができますが、これは待たないでください。 – user1091344

+0

Juan:私は思います(number [j] = 0)または(number [j]、j)> =(number [i]、i))でなければなりません。あなたが言ったようにロックする。 – sdcvvc

+1

Juan:i = jのときは、最初に初期化されているので[j]/= 0、(number [j]、j)==(number [i]、i)、これらの数字は影響を受けません任意のスレッドによって、i番目のスレッドはスタックされます。そのバージョンは正しくありません。 – sdcvvc