正如资源所述,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;
}