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

C编程语言中的严格交替(来自Tanenbaum),c,testing,synchronization,C,Testing,Synchronization,为什么进程0的第一个入口的测试没有严格交替进行(turn==0)//然后进入 进程0如何进入while(turn!=0),这与while(turn==1)是否相同 如果用括号展开您发布的代码,它如下所示: turn = 0; //process 0 to enter while (TRUE) { while (turn != 0) { critical_region(); } turn = 1; noncritical_region(); } 因此,

为什么进程0的第一个入口的测试没有严格交替进行(turn==0)//然后进入 进程0如何进入while(turn!=0),这与while(turn==1)是否相同


如果用括号展开您发布的代码,它如下所示:

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

因此,第一次进入主循环时,它将
turn
设置为1,并调用
noncritical\u region
。第二次调用
critical\u region
时,它可能会停留在那里。

如果您用括号展开发布的代码,它看起来如下所示:

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

因此,第一次进入主循环时,它将
turn
设置为1,并调用
noncritical\u region
。第二次调用
critical\u region
时,它可能会停留在那里。

我怀疑正确的代码是:

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();
}

我怀疑正确的代码是:

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();
}

首先,你的代码错了。Tanenbaum的严格替换如下所示(他的示例没有块,但我认为这样更容易理解):

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

  • 在任何给定的时刻,只有一个进程可以执行函数临界_区域()
  • 这两个进程轮流运行critical_region()(即,一旦进程0运行critical_region(),它必须等待进程1运行critical_region(),然后才能再次运行它)

  • 首先,你的代码错了。Tanenbaum的严格替换如下所示(他的示例没有块,但我认为这样更容易理解):

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

  • 在任何给定的时刻,只有一个进程可以执行函数临界_区域()
  • 这两个进程轮流运行critical_region()(即,一旦进程0运行critical_region(),它必须等待进程1运行critical_region(),然后才能再次运行它)

  • 我认为代码实际上是这样的

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

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

    我认为代码实际上是这样的

    while (TRUE)   
    {  
    while (turn != 0) **;**  
    critical_region;  
    turn=1;  
    noncritical_region;  
    }  
    
    请注意,在本书中,分号位于注释/*loop*/之后,注释写在内部while之后