我正在从事一个处理大量原子操作的项目。直到现在我还不知道atomic_load()
并且只依靠赋值运算符来获取原子类型的值,除了这么多的测试,我还没有看到错误。这些原子类型也被多个进程和线程更改atomic_compare_exchange_strong_explicit()
,因此它们每次都需要一个旧值,这就是我一直这样做的地方oldValue = <Atomic_ type_variable>
,它总是可以正常工作。这只是偶然吗?我应该更喜欢使用 atomic_load() 吗?
问问题
905 次
1 回答
4
foo = atomic_var
只是一种快捷语法foo = atomic_load(&atomic_var);
当您想使用比默认值弱的排序时,它本身就是foo = atomic_load_explicit(&atomic_var, memory_order_seq_cst);
Thatseq_cst
的快捷方式。
在源代码中显式使用的主要原因atomic_load
可能是提醒人类读者变量或指针是原子的。或者作为宏的一部分,使用atomic_load(&(macro_input))
会为非原子指针创建编译时错误。
作为“通用”函数,您不能将普通函数指针指向它。
它的存在可能只是为了更容易编写语言标准,并用函数来解释一切。
这里的关键不是实际的赋值,而是在右值上下文中评估原子变量(将其值作为表达式的一部分读取,就像您通常在右侧找到的那样=
)。 printf("%d\n", my_atomic_var);
也相当于atomic_load
。
顺便说一句atomic_var = foo;
,atomic_store_explicit
与mo_seq_cst
. 在这里,分配是关键。
对原子变量的其他类型的左值引用是不同的,例如 read-modify-writeatomic_var++
等价于atomic_fetch_add
.
于 2019-05-24T14:42:16.853 回答