- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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
无法保证的栅栏?
最佳答案
不,seq-cst-fence 不仅是发布和获取栅栏,而且还提供一些附加属性(请参阅 Working Draft, Standard for Programming Language C++, 32.4.4-32.4.8 )。 seq-cst 栅栏也是所有顺序一致操作的单一总顺序的一部分,强制执行以下观察:
memory_order_seq_cst
栅栏X 在 B 之前排序,然后 B 观察 X 之前 M 的最后一个 memory_order_seq_cst
修改按总顺序S或按其修改顺序对M进行后续修改。memory_order_seq_cst
栅栏 X 使得 A 被排序在X和B之前,在S中的X之后,然后B观察到效果A 或 M 的修改顺序的后续修改。memory_order_seq_cst
栅栏 X 和 Y 使得 A 在 X 之前排序,Y 在 B 之前排序,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/
C++ 支持原子线程栅栏,即保证使用 std::atomic<> 的线程属性的栅栏。操作,具有函数 atomic_thread_fence 。它需要一个内存顺序参数来调整栅栏的“强度”。 我知道,当并
有没有表格总结一下内存顺序的区别?比如每种内存顺序在什么情况下使用 此外,内存顺序和(data_cond和future)有什么区别? is it 1. memory order is for wait
如果使用单个原子变量和 std::memory_order_seq_cst,是否保证非原子操作不会被重新排序? 例如,如果我有 std::atomic quux = {false}; void foo
在多线程程序中,如果只有一个线程使用它,您是否从 memory_order_seq_cst 得到任何保证,即您不会从较弱的顺序中得到保证?示例: #include extern atomic_int
我对C11的阅读spec with regards to atomic operation ordering建议 memory_order_seq_cst适用于对特定原子对象的操作。 大多数情况下,描
我从以下位置获取了有关 std::memory_order_seq_cst 的示例: http://en.cppreference.com/w/cpp/atomic/memory_order #inc
完全/通用内存屏障是指相对于系统其他组件而言,屏障之前指定的所有LOAD和STORE操作似乎都发生在屏障之后指定的所有LOAD和STORE操作之前的情形。 根据cppreference,memory_
我已经阅读了 c++11 标准中关于内存排序的章节,但对规则感到困惑。根据C++11标准(ISO/IEC JTC1 SC22 WG21 N3690),29.3 3,据说: There shall be
引用以下代码 auto x = std::atomic{0}; auto y = std::atomic{0}; // thread 1 x.store(1, std::memory_order_re
引用以下代码 auto x = std::atomic{0}; auto y = std::atomic{0}; // thread 1 x.store(1, std::memory_order_re
存储是释放操作,加载是两者的获取操作。我知道 memory_order_seq_cst 是为了对所有操作施加额外的总排序,但我没有建立一个例子,如果所有 memory_order_seq_cst替换为
我的代码: std::atomic x(22) , y(22); int temp_x = -1, temp_y = -1; void task_0(){ x.store(33, std:
我正在玩 C++ Concurrency in Action 中的一个示例,它使用 std::memory_order_relaxed 从 5 个不同的线程读取和写入 3 个原子变量。示例程序如下:
我正在玩 C++ Concurrency in Action 中的一个示例,它使用 std::memory_order_relaxed 从 5 个不同的线程读取和写入 3 个原子变量。示例程序如下:
我创建了一个简单的测试来检查 std::memory_order_relaxed比 std::memory_order_seq_cst 快atomic 的值增量。然而,这两种情况的性能是相同的。 我的
使用基本的简化版本 seqlock , gcc 将非原子负载重新排序到原子 load(memory_order_seq_cst)使用 -O3 编译代码时.当使用其他优化级别编译或使用 clang 编译
Why does this `std::atomic_thread_fence` work的后续问题 由于虚拟互锁操作优于_mm_mfence,并且有很多方法可以实现它,哪个互锁操作以及应使用哪些数据
来自 c++11 29.3-p3: There shall be a single total order S on all memory_order_seq_cst operations, cons
我正在研究 Google 的灯丝作业系统。目前,我正在研究他们实现的 WorkStealingDequeue。您可以查看完整的源代码here .这个数据结构是基于这个work .在他们的 pop 和
作为Anthony Williams said : some_atomic.load(std::memory_order_acquire) does just drop through to a si
我是一名优秀的程序员,十分优秀!