c - 关于 C 中的原子性保证

标签 c multithreading compiler-construction atomic

在 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/

相关文章:

java - 查找 gps 数据之间的关系

c - 有针对 8086 的 C 编译器吗?

c++ - 为什么 gcc 不报告跟随重复符号的错误?

c++ - 如何在 Opencv API 中实现 GPUImage 过滤器?

python - 在 lldb python 中打印结构数组

c++ - 我如何告诉 cmake 在哪里输出它的构建数据?

java - 使用和重用 Phaser 而不是 join()

c++ - Linux 执行函数 : what is the arg0 parameter used for?

c - OpenMP 通过缩减来折叠并行循环

c++ - 前向声明中的 "using typedef-name ... as class"