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

Mih*_*hir 2 rvalue lvalue-to-rvalue c11 stdatomic

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

\n

Pet*_*des 6

foo = atomic_var只是一个快捷语法foo = atomic_load(&atomic_var);

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

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

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

它的存在可能只是为了让语言标准的编写变得更容易,用函数来解释一切。


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


顺便说一句,同样的事情也适用于与atomic_var = foo;完全相同。在这里,任务是关键atomic_store_explicitmo_seq_cst

对原子变量的其他类型的左值引用是不同的,例如 read-modify-writeatomic_var++相当于atomic_fetch_add.