2016-03-01 99 views
0

我最近在测试中遇到了一个问题,基本上说这是为了让3个并发进程按顺序执行一些代码块。竞赛状况在哪里?


执行顺序柜面说没有道理的例子:

P1 P2 P3 P1 P2 P3 ...

我的回答,我写这个伪ISH代码

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

我的老师w死记硬背的竞争条件,并在Process3的if语句中圈出最后一行,并在process2中绘制了条件语句的箭头。

我很难看到这可能会导致竞争条件。我相信这很明显,但我无法看到它。

谢谢!

+0

你现在明白了吗? – Amit

+0

是的,你的答案是有道理的。我忘记了,如果陈述不是一次全部评估。非常感谢您,我会将您的答案标记为已接受。 @Amit – Danwakeem

回答

1

考虑事件的顺序如下:

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