比赛条件在哪里?
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 的条件语句。
我无法理解这会如何导致竞争条件。我确定它很明显,但我看不到它。
谢谢!
考虑以下事件顺序:
- 一段时间后,s = [1, 1]。
- 在
Process2
内,线程正在计算 if
语句中的表达式,并且刚刚通过了真值条件 s[0] > 0
并且即将继续。
- 在
Process3
中,您将 s
修改为 [-1, -1]。
Process2
计算表达式的其余部分并在 Process1
. 之前开始执行
我最近有一个关于测试的问题,基本上是说让 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 的条件语句。
我无法理解这会如何导致竞争条件。我确定它很明显,但我看不到它。
谢谢!
考虑以下事件顺序:
- 一段时间后,s = [1, 1]。
- 在
Process2
内,线程正在计算if
语句中的表达式,并且刚刚通过了真值条件s[0] > 0
并且即将继续。 - 在
Process3
中,您将s
修改为 [-1, -1]。 Process2
计算表达式的其余部分并在Process1
. 之前开始执行