gpt4 book ai didi

c++ - memory_order_seq_cst 栅栏什么时候有用?

转载 作者:行者123 更新时间:2023-12-01 18:53:30 24 4
gpt4 key购买 nike

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 无法保证的栅栏?

最佳答案

不,seq-cst-fence 不仅是发布和获取栅栏,而且还提供一些附加属性(请参阅 Working Draft, Standard for Programming Language C++, 32.4.4-32.4.8 )。 seq-cst 栅栏也是所有顺序一致操作的单一总顺序的一部分,强制执行以下观察:

  • 对于读取原子对象M值的原子操作B,如果存在memory_order_seq_cst栅栏XB 之前排序,然后 B 观察 X 之前 M 的最后一个 memory_order_seq_cst 修改按总顺序S或按其修改顺序对M进行后续修改。
  • 对于原子对象 M 上的原子操作 AB,其中 A 修改 M B 取其值,如果有一个 memory_order_seq_cst 栅栏 X 使得 A 被排序在XB之前,在S中的X之后,然后B观察到效果AM 的修改顺序的后续修改。
  • 对于原子对象 M 上的原子操作 AB,其中 A 修改 M B 取其值,如果存在 memory_order_seq_cst 栅栏 XY 使得 AX 之前排序,YB 之前排序,X之前S 中的 >Y,然后 B 观察 A 的效果或 M 的后续修改> 按照其修改顺序。

例如,我在危险指针实现中使用 seq-cst 栅栏:https://github.com/mpoeter/xenium/blob/master/xenium/reclamation/impl/hazard_pointer.hpp
获取某个对象的安全引用的线程在存储危险指针之后但在重新读取指向该对象的指针之前使用 seq-cst 栅栏。尝试回收某些对象的线程在从所有线程收集事件危险指针之前使用 seq-cst 栅栏。根据上述规则,这可以确保尝试回收对象的线程看到其他线程具有该对象的 HP(即该对象已使用),或者重新加载尝试获取对该对象的安全引用的线程返回一个不同的指针,向该线程指示该对象已被删除并且必须执行重试。

关于c++ - memory_order_seq_cst 栅栏什么时候有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59316262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com