我最近在测试中遇到了一个问题,基本上说要让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中的条件语句中画了一个箭头。
我很难看出这会导致竞争状况。我确信这很明显,但我无法看到它。
谢谢!
答案 0 :(得分:1)
考虑以下事件顺序:
Process2
内,线程正在评估if
语句中的表达式,并且刚刚通过了真实条件s[0] > 0
并即将继续。Process3
内,您将s
修改为[-1,-1]。Process2
评估表达式的其余部分,并在Process1
之前付诸行动。