我试图了解同步化并理解有些条件需要满足才能使事情正常工作
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。
答案 0 :(得分:1)
我认为重要的一点是,根据your notes的幻灯片6,3条规则适用于算法的关键部分,具体如下:
进度:如果没有人在关键部分并且有人想要, 然后那些不在其余部分的过程必须 能够在有限的时间内决定谁应该进去。
有界等待:所有请求者最终都必须进入关键时刻 部分。
如何打破它:
答案 1 :(得分:0)
正如Malvavisco正确指出的那样,如果进程永远不会释放资源,那么其他进程就无法访问它。这是一个无趣的案例,通常被认为是微不足道的。 (实际上,结果并非如此 - 这就是为什么很多人都强调能够从外部管理流程,例如强行终止一个具有最小不良影响的流程。)
幻灯片的定义实际上有点不精确。我发现这个Wikipedia page on Peterson's algorithm(幻灯片12上的算法#3)更精确。具体做法是:
有限等待意味着"在进程请求进入其关键部分之后且在该请求被授予之前,允许其他进程进入其关键部分的次数存在约束或限制#34;
一些思想实验很清楚,算法#1(幻灯片10)失败了。如果过程切换时间不幸,则任一过程都可以输入关键部分的次数没有限制。假设过程1执行,进入临界区,并且从那里过程2仅切换到过程1处于其临界区。流程1永远不会解释这一点。如果进程2正在等待(反之亦然),那么Peterson的算法将会失去进入临界区的能力。