面包算法max()操作会出现死锁吗?

时间:2016-10-25 11:48:07

标签: multithreading algorithm concurrency locking deadlock

正如资源所述,Bakery算法应该是无死锁的。 但是当我试图理解伪代码时,我想出了一条可能引起僵局的线(根据我的知识)。

对以下代码的反馈, 在Lock()函数中,我们有一行说

  

label [i] = max(label [0],...,label [n-1])+ 1;

如果两个线程同时进入该状态并且由于max不是原子的,那么两个标签将获得相同的值会怎么样?

然后,由于两个标签具有相同的值,因此具有该标签的两个线程将同时获得进入临界区的权限。不会发生僵局吗?

尽我所能在这里解释问题。评论是否还不清楚。谢谢。

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;
}

1 个答案:

答案 0 :(得分:2)

  

然后,由于两个标签具有相同的值,因此具有该标签的两个线程将同时获得进入临界区的权限。不会发生僵局吗?

首先,您可能需要race,而不是deadlock

但是,不,这里没有比赛。如果你看,那就是条件

(label[i],i) > (label[k],k)

当发生这种情况时,线程有效地忙着等待。

这意味着,即使label[i]label[k]相同(因为两者同时执行max),编号更高的线程将推迟编号更低的线程。

(可以说,这是算法的问题,因为它本身就是线程的优先级。)