atomic_load() 和赋值有什么区别?

What is the difference in atomic_load() and assignment?

我正在从事一个处理大量原子操作的项目。直到现在我还不知道 atomic_load() 并且只是依靠赋值运算符来获取原子类型的值并且除了这么多测试之外我还没有看到错误。这些原子类型由多个进程和线程以及 atomic_compare_exchange_strong_explicit() 更改,因此它们每次都需要一个旧值,这就是我一直这样做的地方 oldValue = <Atomic_ type_variable> 并且它总是工作正常。 那只是偶然吗?我应该更喜欢使用 atomic_load() 吗?

foo = atomic_var 只是 foo = atomic_load(&atomic_var);

的快捷语法

它本身是 foo = atomic_load_explicit(&atomic_var, memory_order_seq_cst); 的快捷方式 当您想使用比默认值 seq_cst 更弱的顺序时, 有一个 use-case .

在源代码中显式使用 atomic_load 的主要原因可能是提醒人类读者变量或指针 原子的。或者可能作为宏的一部分,使用 atomic_load(&(macro_input)) 会为 non-atomic 指针创建 compile-time 错误。

作为一个 "generic" 函数,你不能对它使用普通的 function-pointer。

它的存在可能只是为了方便编写语言标准,用函数来解释一切


这里的关键不是实际的赋值,它是在右值上下文中评估原子变量(读取它的值作为一个表达式,就像您通常在 = 的 right-hand 侧找到的那样)。 printf("%d\n", my_atomic_var); 也等同于 atomic_load.


顺便说一句,atomic_var = foo;atomic_store_explicitmo_seq_cst 完全相同。这里 赋值,这是关键。

其他类型的原子变量左值引用是不同的,比如read-modify-write atomic_var++等价于atomic_fetch_add.