同步的3个要求:为什么这种方法不起作用?

时间:2014-10-31 04:57:39

标签: multithreading language-agnostic synchronization mutex theory

我试图了解同步化并理解有些条件需要满足才能使事情正常工作

1)相互排斥 - 没有数据被破坏 2)有限的等待 - 一个线程永远不会做任何事情 3)正在取得进展 - 整个系统正在开展工作,例如不只是绕过谁转过来

我不完全理解为什么下面的代码不起作用。根据我的说明,它有互斥,但不能满足进步或有限的等待。为什么?每个线程都可以做一些事情,只要现在线程崩溃,每个线程都会转弯。 以下是共享变量

int turn; // initially turn = 0
turn == i: Pi can enter its critical section

代码是

do {
  while (turn != i){}//wait
  critical section
  turn = j;//j signifies process Pj in contrast to Pi
  remainder section
} while (true);

它基本上是these notes的幻灯片10。

2 个答案:

答案 0 :(得分:1)

我认为重要的一点是,根据your notes的幻灯片6,3条规则适用于算法的关键部分,具体如下:

  

进度:如果没有人在关键部分并且有人想要,   然后那些不在其余部分的过程必须   能够在有限的时间内决定谁应该进去。

     

有界等待:所有请求者最终都必须进入关键时刻   部分。

如何打破它:

  • Pi执行并且其余部分无限期运行(对此没有限制)
  • Pj完整地运行,设置转弯:=我现在轮到他来运行关键部分。
  • Pi仍然在无限期地运行其余部分。
  • Pj回到了它的关键部分,但从未得到过它,因为Pi永远不会回到可以转向Pj的地步。
    • 这打破了进度规则。没有人在关键部分,Pj想要进入,但无法在有限的时间内决定是否可以进入。
    • 打破有界等待规则。 Pj永远不会被放回到关键部分。

答案 1 :(得分:0)

正如Malvavisco正确指出的那样,如果进程永远不会释放资源,那么其他进程就无法访问它。这是一个无趣的案例,通常被认为是微不足道的。 (实际上,结果并非如此 - 这就是为什么很多人都强调能够从外部管理流程,例如强行终止一个具有最小不良影响的流程。)

幻灯片的定义实际上有点不精确。我发现这个Wikipedia page on Peterson's algorithm(幻灯片12上的算法#3)更精确。具体做法是:

  

有限等待意味着"在进程请求进入其关键部分之后且在该请求被授予之前,允许其他进程进入其关键部分的次数存在约束或限制#34;

一些思想实验很清楚,算法#1(幻灯片10)失败了。如果过程切换时间不幸,则任一过程都可以输入关键部分的次数没有限制。假设过程1执行,进入临界区,并且从那里过程2仅切换到过程1处于其临界区。流程1永远不会解释这一点。如果进程2正在等待(反之亦然),那么Peterson的算法将会失去进入临界区的能力。