【问题标题】:How can context switch affect the modification of a variable?上下文切换如何影响变量的修改?
【发布时间】:2017-07-13 10:21:16
【问题描述】:
float myTotalAmount=0;
void update(float amt){
    myTotalAmount+= amt;
}

任务A调用update(10);

任务B调用update(5);

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

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

总的来说,我想了解race condition

【问题讨论】:

  • 我投票结束这个问题,因为它属于 cs.stackexchange.com

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


【解决方案1】:

int myTotalAmount = 0

任务 A

Updata(10);

任务 B

Updata(5)


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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-13
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    相关资源
    最近更新 更多