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

时间:2019-05-24 11:48:30

标签: c11 rvalue stdatomic lvalue-to-rvalue

我正在从事一个涉及许多原子操作的项目。到目前为止,我对atomic_load()一无所知,只依靠赋值运算符来获取原子类型的值,除了进行大量测试外,我没有看到任何错误。这些原子类型会被多个进程和线程更改,atomic_compare_exchange_strong_explicit()也会改变它们,因此它们每次都需要一个旧值,这就是我一直在做的oldValue = <Atomic_ type_variable>,它总是可以正常工作。 那是偶然吗?我应该更喜欢使用atomic_load()吗?

1 个答案:

答案 0 :(得分:1)

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

的快捷语法

这本身就是foo = atomic_load_explicit(&atomic_var, memory_order_seq_cst);的快捷方式 当您要使用比默认seq_cst弱的排序时,有一个用例。

在源代码中显式使用atomic_load的主要原因可能是要提醒人类读者,变量或指针原子的。也许作为宏的一部分,使用atomic_load(&(macro_input))会为非原子指针产生编译时错误。

作为“通用”函数,您不能使用普通的函数指针。

它的存在可能只是为了简化语言标准的编写,并从功能上解释一切。


不是真正的赋值在这里很关键,它是在右值上下文中评估原子变量(将其值作为表达式的一部分读取,就像您通常在=的右侧)。 printf("%d\n", my_atomic_var);也等同于atomic_load


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

对原子变量的其他左值引用不同,例如,读-修改-写atomic_var++等效于atomic_fetch_add