1
float myTotalAmount=0; 
void update(float amt){ 
    myTotalAmount+= amt; 
} 

任务A致电update(10);上下文切换如何影响变量的修改?

任务B调用update(5);

如何竞争状况影响的myTotalAmount的结果呢?

任务B能够调用更新方法,因为上下文切换发生由于某种原因之前任务A完成了吗?我想了解race condition

+0

我投票结束这个问题作为题外话,因为它属于cs.stackexchange.com –

回答

1

int myTotalAmount = 0

任务A

Updata(10);

任务B

Updata(5)


myTotalAmount+= amt;不是原子操作。从这个意义上说,这条线将被翻译成多个机器命令。

话虽这么说,任务A将节省的myTotalAmount值在寄存器中,该值将是0。如果上下文切换现在happends和Task B开始运行时,它会修改myTotalAmount是5.现在的操作系统决定再次运行Task A。 即使myTotalAmount的值现在为5,我们已经提取了该值并将其保存在一个寄存器中,它是0。执行将继续从myTotalAmount0。现在myTotalAmount将获得分配0+10,它将是10而不是15

要解决此问题,您可以部署一些同步以防止竞争条件。你可以使用锁定。