上下文切换如何影响变量的修改?

时间:2017-02-23 04:44:50

标签: multithreading process operating-system synchronization context-switch

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

任务致电update(10);

任务B致电update(5);

种族条件如何影响myTotalAmount的结果?

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

总而言之,我想了解race condition

1 个答案:

答案 0 :(得分:1)

int myTotalAmount = 0

任务A

Updata(10);

任务B

Updata(5)

myTotalAmount+= amt;不是原子操作。从某种意义上说,这条线将被转换为多个机器命令。

话虽这么说,任务A会将myTotalAmount的值保存在寄存器中,该值将为0.如果上下文切换现在发生且Task B开始运行,它将修改{{1现在操作系统决定再次运行myTotalAmount。 即使Task A的值现在是myTotalAmount,我们已经提取了该值并将其保存在寄存器中,它是5。执行将从0myTotalAmount的那一点开始继续。现在0将被分配myTotalAmount,而0+10代替10

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