1

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

4

1 回答 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_explicitmo_seq_cst. 在这里,分配是关键

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

于 2019-05-24T14:42:16.853 回答