我对以下c中的实际同步点有疑问 - 就像psuedocode示例一样。在我们的幻灯片中,同步点显示在下面指出的位置。
两个进程2路同步,x和y = 0表示启动
Process 1
signal(x);
//Marked as sync point
wait(y);
Process 2
signal(y);
//This arrow isn't as exact but appears to be near the middle again.
wait(x);
现在只有两个进程2路同步这似乎是有道理的。但是,当扩展这两个3进程3路同步这个逻辑似乎打破了。幻灯片中没有给出箭头。
3 Process 3 Way Synchronization (S1, S2, S3 = 0 to start)
Process 0
signal(S0);
signal(S0);
wait(S1);
wait(S2);
Process 1
signal(S1);
signal(S1);
wait(S0);
wait(S2);
Process 2
signal(S2);
signal(S2);
wait(S0);
wait(S1);
现在我发现同步点实际上并不在信号和等待之间。例如:
让过程0首先运行并向S0发出一次信号。现在S0 = 1.现在让我们说在运行第二个信号(S0)之前,过程被中断并且过程1接下来运行。让我们说在进程中断之前只能运行一个信号(S1)。现在S1 = 1的值。现在让我们说下一步运行2。允许该信号(S2)运行,因此S2 = 2.现在该过程不被中断,因此允许它继续。等待(S0)运行,使S0递减1.S0现在等于0.但是,允许进程2继续运行,因为S0的值不是负值。现在等待(S1)被允许运行,这里发生类似的事情。
此时,流程2已完成运行。然而,过程0和过程1没有完成他们的信号。如果同步点真正位于信号之间并等待,则此解决方案对3路3进程同步是不正确的。
类似的问题可能出现在3进程3路同步的解决方案中,它允许每个进程一次运行多个自身的实例。随附的是幻灯片,但我不解释为什么"中间"由于我已经拥有巨大的文本墙,因此该过程中的点不能成为同步点。
请让我知道哪种方式是正确的,没有多少谷歌搜索给了我答案。我将包括所有相关幻灯片。