concurrency - R界等待彼得森锁

标签 concurrency

在多处理器编程的艺术中,修订版。第一版2,练习9如下(表述):


定义r边界等待互斥算法,以表示DAj➝DBk⇒CSAj➝CSBk + r。有没有一种方法可以为Peterson算法定义门口,从而提供r边界等待?


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

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

现在开始思考一个问题:在我看来,Peterson算法是完全公平的(0界等待)。此外,我认为r界等待意味着所有k> r的k界等待。那么这个问题就没有意义了,因为彼得森应该满足r界等待所有r的问题。

这个问题是否要求“简化”彼得森算法,因为它要求放宽约束?

这是自学而非功课。

彼得森锁算法的代码,摘自本书:

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 }

最佳答案

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

让我们(自然而然地)在代码中将门口部分定义为第6-9行,将等待部分定义为第10行。假设D0j➝D1k并且两个线程都在其相应的等待部分中。在这种情况下,flag[0]==trueflag[1]==truevictim==1;因此,线程0可能退出其等待部分,而线程1可能不会退出。因此,线程0首先进入,即CS0j➝CS1k,并且Peterson锁具有0界等待,即公平。

但是我认为这个问题确实有意义。这是一项练习,因此本节的第一个练习不是很困难-但我认为检查概念是否理解仍然很有用。这本书并没有说彼得森锁是公平的。相反,它要求(也许以某种复杂的方式)证明它是一种练习。

关于concurrency - R界等待彼得森锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23917752/

相关文章:

c# - (更多)线程二叉树中旋转节点时的高效锁定

mysql - 如何使用乐观并发控制解决直读缓存中的冲突?

node.js - 我应该在 node.js 中 fork() 多少子进程?

java - spring boot应用和并发问题

java - 限制运行特定方法的线程数的最佳方法是什么?

goroutine race condition 解决方案

Python 多处理 block 在 waiter.acquire() 中不确定

java - 在未来的代码中使用同步/锁

concurrency - 锁定 Camel 处理器

c++ - _mm_sfence 与 __faststorefence