上下文切换如何影响变量的修改?
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
。的执行将从 myTotalAmount
为 0
的那一点继续。现在 myTotalAmount
将被分配 0+10
,它将是 10
而不是 15
。
要解决此问题,您可以部署一些同步来防止竞争条件。你可以使用锁。
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
。的执行将从 myTotalAmount
为 0
的那一点继续。现在 myTotalAmount
将被分配 0+10
,它将是 10
而不是 15
。
要解决此问题,您可以部署一些同步来防止竞争条件。你可以使用锁。