比赛条件在哪里?

Where is the race condition?

我最近有一个关于测试的问题,基本上是说让 3 个并发进程按顺序执行一些代码块。


不合理的执行顺序示例:

P1 P2 P3 P1 P2 P3 ...

为了我的回答,我写了这个伪代码

shared s[2] = {-1,-1};
void Process1(){
   while(1){
      if(s[0] < 0 && s[1] < 0){
         DO_CS;
         s[0] = 1;
      }
   }
}

void Process2(){
   while(1){
      if(s[0] > 0 && s[1] < 0){
         DO_CS;
         s[1] = 1;
      }
   }
}

void Process3(){
   int i = 0;
   while(1){
      if(s[1] > 0 && s[0] > 0){
         DO_CS;
         s[0] = -1;
         s[1] = -1;
      }
  }
}

我的老师写了race condition,在Process3 的if 语句的最后一行画了圈,并画了一个箭头指向process2 的条件语句。

我无法理解这会如何导致竞争条件。我确定它很明显,但我看不到它。

谢谢!

考虑以下事件顺序:

  1. 一段时间后,s = [1, 1]。
  2. Process2 内,线程正在计算 if 语句中的表达式,并且刚刚通过了真值条件 s[0] > 0 并且即将继续。
  3. Process3 中,您将 s 修改为 [-1, -1]。
  4. Process2 计算表达式的其余部分并在 Process1.
  5. 之前开始执行