C编程语言的严格交替(来自Tanenbaum)

时间:2009-11-06 07:44:13

标签: c testing synchronization

为什么测试不是在进程0的第一个入口严格交替时(转= = 0)//然后输入 如何处理0进入(转!= 0),是否与while相同(转= = 1)?

turn = 0;
//process 0 to enter
while (TRUE) {
  while (turn != 0)
    critical_region();
  turn = 1;
  noncritical_region();
}

//process 1 to enter
while (TRUE) {
  while (turn != 1)
    critical_region();
  turn = 0;
  noncritical_region();
}

4 个答案:

答案 0 :(得分:4)

首先,您的代码有误。 Tanenbaum的严格交替看起来像这样(他的例子写的没有块,但我认为这样做更容易):

while (TRUE) {
    while (turn != 0)
    {
        /* do nothing */
    }
    critical_region();
    turn = 1;
    noncritical_region();
}

严格交替的想法有两个方面:

  1. 在任何给定的时刻,只有一个进程可以执行函数critical_region()
  2. 这两个进程轮流运行critical_region()(即,一旦进程0运行critical_region(),它必须等待进程1运行critical_region()才允许再次运行它。)

答案 1 :(得分:1)

如果展开使用括号发布的代码,它看起来像这样:

turn = 0;
//process 0 to enter
while (TRUE) 
{
   while (turn != 0)
   {
      critical_region();
   }
   turn = 1;
   noncritical_region();
}

因此,当您第一次进入主循环时,它会将turn设置为1并调用noncritical_region。它第二次调用critical_region并且可能会停留在那里。

答案 2 :(得分:1)

我认为代码实际上就像这样

while (TRUE)   
{  
while (turn != 0) **;**  
critical_region;  
turn=1;  
noncritical_region;  
}  

请注意,在书中,分号是在内部后面的注释/ * loop * /之后写的。

答案 3 :(得分:0)

我怀疑正确的代码是:

turn = 0;
//process 0 to enter
while (TRUE) {
   while (turn != 0) critical_region();
   turn = 1;
   noncritical_region();
}

//process 1 to enter
while (TRUE) {
   while (turn != 1) critical_region();
   turn = 0;
   noncritical_region();
}