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

How can context switch affect the modification of a variable?

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

任务A调用update(10);

任务 B 调用 update(5);

竞争条件如何影响 myTotalAmount 的结果?

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

总而言之,我正在努力理解 race condition

int myTotalAmount = 0

任务 A

Updata(10);

任务 B

Updata(5)


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

也就是说,任务 A 会将 myTotalAmount 的值保存在寄存器中,该值将为 0。如果现在发生上下文切换并且 Task B 开始 运行ning ,它会将 myTotalAmount 修改为 5。现在 OS 再次决定 运行 Task A。 即使 myTotalAmount 的值现在是 5,我们已经提取该值并将其保存在寄存器中,它是 0。的执行将从 myTotalAmount0 的那一点继续。现在 myTotalAmount 将被分配 0+10,它将是 10 而不是 15

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