gpt4 book ai didi

assembly - 为什么 i++ 在单核机器上不是线程安全的?

转载 作者:行者123 更新时间:2023-12-03 22:45:56 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:




10 年前关闭。




Possible Duplicate:
Are incrementers / decrementers (var++, var--) etc thread safe?



您能否在汇编代码级别为我描述一下,为什么在单核机器上从两个不同的线程递增一个值不被认为是安全的?

最佳答案

考虑可能为类似 i++ 的语句生成的指令。 .当然,这将取决于您的架构/指令集,但它可能是这样的:

LOAD    @i, r0    ;load the value of 'i' into a register from memory
ADD r0, 1 ;increment the value in the register
STORE r0, @i ;write the updated value back to memory

现在考虑如何在操作系统中实现多线程,而不管机器有多少个内核。在最基本的层面上,操作系统将需要一些工具来中断当前线程的执行,保存其状态,并执行到不同线程的上下文切换。操作系统无法自动知道用户线程中的哪些指令应该被视为原子操作,并且能够在任意两条指令之间启动上下文切换。

那么如果操作系统在 LOAD 之间执行从一个线程到另一个线程的上下文切换会发生什么?和 ADD ?假设 i开始时值为 0,所以 r0当第一个线程被换出时将被设置为 0。操作系统会将此值保存为该线程状态的一部分。现在第二个线程运行,并执行相同的 LOAD陈述。内存中的值仍然是0,所以 r0再次将 0 加载到其中。线程递增该值并将其写回内存,设置值 i到 1。现在第一个线程恢复执行,操作系统恢复 r0 的值。到 0 作为其上下文切换的一部分。第一个线程现在执行它的增量,设置 r0到 1,并且 1 的值存储在 i 中再次。现在 i 的值不正确,因为已经应用了两个增量,但该值仅增加了 1。

所以简而言之,即使 i++是高级语言中的单个语句,它生成多个汇编语言指令,并且操作系统/运行时环境不会将这些指令视为原子指令,除非您在它们周围添加额外的同步逻辑。

关于assembly - 为什么 i++ 在单核机器上不是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6052768/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com