在 x86 机器上,像 inc、addl 这样的指令不是原子的,在 SMP 环境下使用它们时没有 lock 前缀是不安全的。但在UP环境下是安全的,inc、addl等简单指令不会被中断。
我的问题是,给定一个像
这样的 C 级语句x = x + 1;
是否有任何保证 C 编译器将始终使用像这样的 UP 安全指令
incl %eax
但即使在 UP 环境中,那些线程不安全的指令(例如在可能被上下文切换中断的多条指令中实现 C 语句)也不行吗?
最佳答案
没有。
您可以使用“volatile”,它可以防止编译器将 x 保存在临时寄存器中,对于大多数目标,这实际上会产生预期的效果。但这并不能保证。
为了安全起见,您应该使用一些内联汇编,或者如果您需要保持可移植性,请使用互斥体封装增量。
关于c - 关于 C 中的原子性保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1443580/