【问题标题】:What is the difference in atomic_load() and assignment?atomic_load() 和 assignment 有什么区别?
【发布时间】:2019-05-24 11:48:30
【问题描述】:

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

【问题讨论】:

  • 您需要什么订单?
  • 我对内存排序不是很熟悉(真的很混乱)。也许那在 atomic_load_explicit() 中。我的问题只是关于 atomic_load(),有人给出了答案。
  • 你很困惑吗?所以他的每个人,我相信。研究人员认为,宽松排序的规范存在严重缺陷!

标签: c11 rvalue stdatomic lvalue-to-rvalue


【解决方案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

【讨论】:

    猜你喜欢
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    • 2013-08-19
    相关资源
    最近更新 更多