我正在从事一个涉及许多原子操作的项目。到目前为止,我对atomic_load()
一无所知,只依靠赋值运算符来获取原子类型的值,除了进行大量测试外,我没有看到任何错误。这些原子类型会被多个进程和线程更改,atomic_compare_exchange_strong_explicit()
也会改变它们,因此它们每次都需要一个旧值,这就是我一直在做的oldValue = <Atomic_ type_variable>
,它总是可以正常工作。
那是偶然吗?我应该更喜欢使用atomic_load()吗?
答案 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_explicit
与mo_seq_cst
完全相同。在这里,是分配是关键。
对原子变量的其他左值引用不同,例如,读-修改-写atomic_var++
等效于atomic_fetch_add
。