竞争条件在哪里?

时间:2016-03-01 22:17:24

标签: multithreading logic race-condition pseudocode

我最近在测试中遇到了一个问题,基本上说要让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;
      }
  }
}

我的老师编写了竞争条件,并在Process3的if语句中圈出了最后一行,并在process2中的条件语句中画了一个箭头。

我很难看出这会导致竞争状况。我确信这很明显,但我无法看到它。

谢谢!

1 个答案:

答案 0 :(得分:1)

考虑以下事件顺序:

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