R-bound等待彼得森锁

时间:2014-05-24 18:12:46

标签: concurrency

多处理器编程的艺术,rev。第1版,在Ch。 2,练习9如下(转述):

  

定义r-bound等待互斥算法表示D A j ➝D B k ⇒CS A j ➝CS B k + r 。有没有办法为Peterson算法定义一个门口,以便它提供r-有界等待?

本书使用➝定义事件优先顺序的总顺序,其中X➝Y表示事件X在Y开始之前开始并完成。 D A 是线程A的“门口”事件,它是请求进入临界区的事件。 CS A 是线程A的关键部分事件。

对于任何事件X A ,X A i 是线程A上事件X的第i次执行。

现在回答这个问题:在我看来,Peterson算法是完全公平的(0-有限等待)。此外,我认为r-有界等待意味着k-bounded等待所有k>河然后这个问题没有意义,因为彼得森应该满足r-bounded等待所有r。

问题是要求Peterson算法的“简化”,因为它要求放宽约束?

这是自学,而不是家庭作业。

Peterson锁算法的代码,取自本书:

1 class Peterson implements Lock {
2     // thread-local index, 0 or 1
3     private volatile boolean[] flag = new boolean[2];
4     private volatile int victim;
5     public void lock() {
6         int i = ThreadID.get();
7         int j = 1 - i;
8         flag[i] = true; // I’m interested
9         victim = i; // you go first
10        while (flag[j] && victim == i) {}; // wait
11     }
12     public void unlock() {
13         int i = ThreadID.get();
14         flag[i] = false; // I’m not interested
15     }
16 }

1 个答案:

答案 0 :(得分:6)

你是对的,两个线程的Peterson算法是公平的(又名先到先得)。

让我们(非常自然地)将门口部分定义为代码中的第6-9行,将等待部分定义为第10行。让我们假设D 0 j ➝D 1 k ,两个线程都在相应的等待部分。在这种情况下,flag[0]==trueflag[1]==truevictim==1;因此,线程0可以退出其等待部分,而线程1可以不退出。因此,线程0首先出现,即CS 0 j ➝CS 1 k 且Peterson锁具有0-bounded等待,即公平。

但我认为这个问题确实有意义。这是一个练习,这个部分的第一个练习不是很难 - 但我认为检查这些概念是否有用仍然很有用。这本书没有说彼得森锁是公平的;相反,它要求(可能以一种有点复杂的方式)将其证明为一种练习。