C++支持原子线程围栏,即保证使用std::atomic<>操作的线程具有函数atomic_thread_fence的属性。它需要一个内存顺序参数来调整栅栏的“强度”。
我知道,当并非所有原子操作都是用“强”顺序完成时,篱笆是有用的。
(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不能保证发布于 2020-02-03 10:16:09
不,seq-cst-fence不仅是一种发布和获取-栅栏,而且还提供了一些额外的属性(请参阅工作草案,编程语言标准C++,32.4.4-32.4.8)。seq-cst栅栏也是所有顺序一致的操作的单一总顺序的一部分,执行下列意见:
memory_order_seq_cst栅栏X,则B以总顺序观察M在X之前的最后memory_order_seq_cst修改,或者以其修改顺序观察对M的后期修改。memory_order_seq_cst栅栏X,使得A在X和B跟随X之前被排序,则B以其修改顺序观察A的影响或后来对M的修改。memory_order_seq_cst栅栏X和Y,使得A在X之前被排序,Y在B之前排序,X在S中先于Y,则B以其修改顺序观察A的效果或对M的后期修改。例如,我在危险指针实现中使用seq-cst栅栏:pointer.hpp。
获取对某些对象的安全引用的线程在存储危险指针之后,但在重新读取指向对象的指针之前,使用seq栅栏。试图回收某些对象的线程在收集所有线程的活动危险指针之前使用seq栅栏。基于上面的规则,这可以确保试图恢复对象的线程看到其他线程对此对象具有HP (即使用对象),或者重新加载试图获取对对象的安全引用的线程返回另一个指针,指示该对象已被移除并必须执行重试。
https://stackoverflow.com/questions/59316262
复制相似问题