我们可以在 Peterson 的解决方案中仅使用一个变量 - 转吗?

I a*_*one 4 c++ algorithm concurrency operating-system

这是我们讲座中提出的彼得森解决方案

//P0:

do {
  flag[0] = TRUE; turn = 1;
  while(flag[1] && turn == 1);

  //Critical section
  flag[0] = FALSE;
  //remainder section
} while(1)


//P1:

do {
  flag[1] = TRUE; turn = 0;
  while(flag[0] && turn == 0);
  
  //critical section
  flag[1] = FALSE;
  //remainder section
} while(1)
Run Code Online (Sandbox Code Playgroud)

转变量本身不就已经保证了临界区的要求吗?像flag[]这里似乎没有必要。

And*_*zel 5

flag数组指定每个进程当前是否对临界区感兴趣(即当前是否希望进入临界区或已经在临界区内部)。由于以下原因,此信息是必要的:

假设进程 #0 想要进入临界区,它必须知道进程 #1 当前是否也对临界区感兴趣,因为进程 #0 必须根据进程 #1 是否也对临界区感兴趣而采取不同的行动。

如果进程 #1对临界区turn感兴趣,则进程 #0 不应等待进程 #1 设置为0,因为它可能无限期地等待这种情况发生,这将违反“进度”和“有界等待”要求。相反,在这种情况下,进程 #0 应该简单地进入临界区。

如果进程 #1临界区感兴趣,那么进程 #0 应该等待进程 #1

  • 离开临界区(进程 #1 通过设置为flag[1]来指示false),或者
  • 屈服于进程#0(进程#1 通过设置为turn来指示0)。

否则,就会违反“互斥”要求。