0

我想了解synchornization和理解有三个条件需要满足的东西才能正常工作3同步要求:为什么这种方法不起作用?

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

'j'从哪里来? – Thilo 2014-10-31 04:59:27

+0

@Thilo另一个线程,我将编辑以使其更清晰 – Celeritas 2014-10-31 05:02:05

+0

因此,每个线程都知道它的“下一个线程”? – Thilo 2014-10-31 05:05:59

回答

1

我觉得最重要的一点是,根据滑动your notes 6 3个规则适用于该算法的关键部分和恰好如下:

进展:如果没有人在关键的部分,有人想, 那么这些进程都不会在他们的其余部分必须 能够在有限的时间谁应该去决定。

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

如何打破它:

  • 丕执行和它的其余部分将无限期运行,(对此没有限制)
  • 点Pj运行的全部,设置依次为:= I所以它现在丕轮到运行关键部分。
  • Pi仍在运行其无限期运行的其余部分。
  • Pj回到了它的关键部分,但从来没有得到运行它,因为PI永远不会回到它可以让转向Pj的点。
    • 这打破了进展规则。没有人处于关键部分,Pj希望进入但无法在有限时间内决定是否可以进入。
    • 打破有界等待规则。 Pj永远不会回到关键部分。
+0

好的,但考虑到其他算法,比如Dekker的解决方案或者Peterson的解决方案,难道你不能轻易地说他们的剩余部分无限期运行吗?你的情景看起来很不公平,因为它就像从算法的一些事情开始,即有一个无限循环? – Celeritas 2014-11-02 03:46:04

+0

对于非关键位将做什么没有限制,因此必须考虑每个可能性。不确定的运行部分是完全可能的,并不意味着算法以任何方式被破坏。 关于您提出的解决方案,它们不能以相同的方式打破。 对于这两种算法,只要进程完成其临界区域,它就会将其标志设置为false,以此作为表示当时不想进入临界区域的方式,因此另一个进程不会停止并等待为了它。 – Malvavisco 2014-11-04 14:22:14

0

由于Malvavisco正确地指出,如果一个进程永远不会释放资源没有其他进程将有机会获得它。这是一个无趣的案例,通常被认为是微不足道的。 (事实上​​,结果并非如此 - 这就是为什么强调能够从外部管理流程的原因,例如强行终止一个流程,并且影响最小。)

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

界等待意味着“存在于次其他进程被允许进入其关键部分的数量的界限或限制的方法取得了进入其临界区和该请求之前的请求之后被授予“

有些思想实验使得它非常清楚算法#1(幻灯片10)失败了。如果过程切换时间不合适,那么任何一个过程都可以输入关键部分的次数没有限制。假定进程1执行,进入关键部分,并且从那里开始,进程2仅切换到进程1处于关键部分时。流程1永远不会解释这一点。如果进程2正在等待(反之亦然),则Peterson的算法将作为进程1放弃其进入关键部分的能力。

+0

起初我想把它归咎于非原子操作,但后来我意识到彼得森的算法假定某些操作是原子操作的,因此讲座也必须假设这一点。我会假设幻灯片假设相关的共享内存变量有原子写入。 – Kaganar 2014-10-31 14:07:03

相关问题