【发布时间】:2019-05-18 19:32:09
【问题描述】:
在某处我读到一元运算符本质上是原子的,因此它们可以在多线程环境中使用。为了确认这一点,我编写了两个单独的程序,其中
- 我使用了一个变量 x 并使用一元运算符 ++x 递增
- 我使用了变量 x 并使用 x=x+1 递增
我对比了两个程序的反汇编,没有发现差异。请提供您对此的意见。
【问题讨论】:
-
仅仅因为
++x是原子的并不意味着x=x+1不是吗? (从逻辑的角度来看,我怀疑++x始终是原子的) -
给定一个变量可以驻留在内存中,因此需要多个指令(加载、添加、存储),它们不会自动成为原子
-
我怀疑无论你在哪里读到,它所使用的“原子”一词的含义都与并发上下文中使用的含义不同。要么,要么他们完全错了,你不应该相信你在那里看到的任何东西。
-
std::atomic将由了解您所针对的硬件的人实施,可能比您做得更好。让专家做这项工作。当你需要原子性时使用std::atomic。 -
@chux 问题说的是“一元运算符”,而不是带有连字符和斜体的“一元运算符”,暗示了 C/C++ 语法特定的含义。后缀
operator++也不是 unary-expression 的一部分,而是 postfix-expression 的一部分。一元运算符是一个通用的、被广泛理解的术语,在这里可以正确使用。