关于C中的原子性保证

Zel*_*luX 2 c compiler-construction multithreading atomic

在x86机器上,像inc,addl这样的指令不是原子的,在SMP环境下,没有锁前缀使用它们是不安全的.但是在UP环境下它是安全的,因为inc,addl和其他简单的指令不会被中断.

我的问题是,给出一个像C级的声明

x = x + 1;
Run Code Online (Sandbox Code Playgroud)

是否有任何保证C编译器将始终使用UP安全指令

incl %eax
Run Code Online (Sandbox Code Playgroud)

但是,即使在UP环境中,也不是那些线程不安全的指令(比如在几条指令中实现可能被上下文切换中断的C语句)?

Gun*_*iez 6

没有.

您可以使用"volatile"来阻止编译器将x保存在临时寄存器中,对于大多数目标,这实际上会产生预期的效果.但它不能保证.

为了安全起见,您应该使用一些内联asm,或者如果您需要保持便携性,请使用互斥锁封装增量.