首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >memory_order_seq_cst栅栏什么时候有用?

memory_order_seq_cst栅栏什么时候有用?
EN

Stack Overflow用户
提问于 2019-12-13 04:44:08
回答 1查看 767关注 0票数 6

C++支持原子线程围栏,即保证使用std::atomic<>操作的线程具有函数atomic_thread_fence的属性。它需要一个内存顺序参数来调整栅栏的“强度”。

我知道,当并非所有原子操作都是用“强”顺序完成时,篱笆是有用的。

  • 当线程中并非所有原子读取(1)都是获取操作时,您可能会发现获取栅栏的用途;
  • 当线程中并非所有原子修改(1)都是发布操作时,您可能会发现释放栅栏的用途。

(1)包括RMW作业

因此,所有这些(获取、释放和acq_rel栅栏)的有用性是显而易见的:它们允许使用比acq/rel弱的原子操作的线程正确地同步。

但我不明白为什么需要memory_order_seq_cst作为围栏:

  • 使用比memory_order_seq_cst原子操作和memory_order_seq_cst栅栏更弱的操作意味着什么?
  • memory_order_seq_cst栅栏具体地保证什么(就原子操作的可能顺序而言),而memory_order_acq_rel不能保证
EN

回答 1

Stack Overflow用户

发布于 2020-02-03 10:16:09

不,seq-cst-fence不仅是一种发布和获取-栅栏,而且还提供了一些额外的属性(请参阅工作草案,编程语言标准C++,32.4.4-32.4.8)。seq-cst栅栏也是所有顺序一致的操作的单一总顺序的一部分,执行下列意见:

  • 对于读取原子对象M的值的原子操作B,如果在B之前有一个memory_order_seq_cst栅栏X,则B以总顺序观察M在X之前的最后memory_order_seq_cst修改,或者以其修改顺序观察对M的后期修改。
  • 对于原子对象M上的原子运算A和B,其中A修改M和B取其值,如果存在memory_order_seq_cst栅栏X,使得A在X和B跟随X之前被排序,则B以其修改顺序观察A的影响或后来对M的修改。
  • 对于原子对象M上的原子运算A和B,其中A修改M和B取其值,如果存在memory_order_seq_cst栅栏X和Y,使得A在X之前被排序,Y在B之前排序,X在S中先于Y,则B以其修改顺序观察A的效果或对M的后期修改。

例如,我在危险指针实现中使用seq-cst栅栏:pointer.hpp

获取对某些对象的安全引用的线程在存储危险指针之后,但在重新读取指向对象的指针之前,使用seq栅栏。试图回收某些对象的线程在收集所有线程的活动危险指针之前使用seq栅栏。基于上面的规则,这可以确保试图恢复对象的线程看到其他线程对此对象具有HP (即使用对象),或者重新加载试图获取对对象的安全引用的线程返回另一个指针,指示该对象已被移除并必须执行重试。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59316262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档