【问题标题】:Bakery algorithm (deadlock?)烘焙算法(死锁?)
【发布时间】:2011-12-10 15:34:26
【问题描述】:

http://en.wikipedia.org/wiki/Lamport%27s_bakery_algorithm

我有一些问题要理解这个算法。如果当前线程和我正在查看的 for 循环中的那一刻线程相同,会发生什么?

线程:0、1、2

线程 1 拿到票 1。线程 2 拿到票 2。线程 0 什么也不做。

数组 = i: 0, 1, 2

第一轮:

  • 线程 1 (j=0):Array[0] = 0。下一个。
  • 线程 2 (j=0):Array[0] = 0。下一个。

第二轮:

  • 线程 1 (j=1):Array[1] = 1. (1,1) > (1,1)
  • 线程 2 (j=1):Array[1] = 1. (1,1) > (2,2)

(1,1) > (1,1) 错误。 (1,1) > (2,2) 错误。

两个线程都在等待...

怎么了?这是死锁吗?

【问题讨论】:

  • 这是什么意思:(1,1) > (1,1)?
  • (a, b)

标签: multithreading algorithm for-loop deadlock


【解决方案1】:

算法中的while循环允许线程在不等式成立时进入临界区。它说:只要条件 (Number[j] != 0) && ((Number[j], j)

由于 (1,1) 不大于 (1,1),线程 1 可以通过循环并进入临界区。

【讨论】:

  • 我知道了,但我还发现了另一种算法,用 "await((number[j] = 0) or (number[j], j) > (number[i], i))" 代替的while循环。这里也一样吗?我可以用 while 理解它,但不能用这个 await。
  • 胡安:我觉得应该是await((number[j] = 0) or (number[j],j) >= (number[i], i)),否则有正如你所说的那样陷入僵局。
  • 胡安:当i=j时,肯定是number[j] /= 0,因为它是一开始初始化的,并且(number[j],j) == (number[i],i) ,并且这些数字不受任何线程的影响,因此第 i 个线程将被卡住。所以那个版本不正确。
猜你喜欢
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
相关资源
最近更新 更多