float myTotalAmount=0;
void update(float amt){
myTotalAmount+= amt;
}
任务致电update(10)
;
任务B致电update(5);
种族条件如何影响myTotalAmount
的结果?
任务B 能够调用更新方法,因为在任务A 完成之前由于某种原因发生了上下文切换?
总而言之,我想了解race condition
。
答案 0 :(得分:1)
int myTotalAmount = 0
任务A
Updata(10);
任务B
Updata(5)
myTotalAmount+= amt;
不是原子操作。从某种意义上说,这条线将被转换为多个机器命令。
话虽这么说,任务A会将myTotalAmount
的值保存在寄存器中,该值将为0.如果上下文切换现在发生且Task B
开始运行,它将修改{{1现在操作系统决定再次运行myTotalAmount
。
即使Task A
的值现在是myTotalAmount
,我们已经提取了该值并将其保存在寄存器中,它是5
。执行将从0
为myTotalAmount
的那一点开始继续。现在0
将被分配myTotalAmount
,而0+10
代替10
。
要解决此问题,您可以部署一些同步以防止竞争条件。你可以使用锁。