- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
完全/通用内存屏障是指相对于系统其他组件而言,屏障之前指定的所有LOAD和STORE操作似乎都发生在屏障之后指定的所有LOAD和STORE操作之前的情形。
根据cppreference,memory_order_seq_cst
等于memory_order_acq_rel
加上在这样标记的所有操作上的单个总修改顺序。但是据我所知,C++ 11中的获取或释放围栏都不会强制执行#StoreLoad(存储后加载)排序。释放栅栏要求任何后续的写操作都不能对先前的读/写进行重新排序;获取栅栏要求后续的读/写操作不能与先前的任何读操作重新排序。如果我错了,请纠正我;)
举个例子
atomic<int> x;
atomic<int> y;
y.store(1, memory_order_relaxed); //(1)
atomic_thread_fence(memory_order_seq_cst); //(2)
x.load(memory_order_relaxed); //(3)
x.load(memory_order_relaxed); //(3)
y.store(1, memory_order_relaxed); //(1)
atomic_thread_fence(memory_order_seq_cst); //(2)
atomic_thread_fence(memory_order_seq_cst)
不一定包含完整障碍所具有的语义。
最佳答案
atomic_thread_fence(memory_order_seq_cst)
始终会生成完整屏障。
MFENCE
hwsync
mf
dmb ish
sync
Is it allowed by a optimizing compiler to reorder instruction (3) to before (1)?
memory_order_seq_cst
进行具有这些值atomic_thread_fence(memory_order_seq_cst);
-但这种方法通常不能保证顺序一致性,因为顺序一致性更强,可以保证§ 29.3 Order and consistency
§ 29.3 / 8
[ Note: memory_order_seq_cst ensures sequential consistency only for a program that is free of data races and uses exclusively memory_order_seq_cst operations. Any use of weaker ordering will invalidate this guarantee unless extreme care is used. In particular, memory_order_seq_cst fences ensure a total order only for the fences themselves. Fences cannot, in general, be used to restore sequential consistency for atomic operations with weaker ordering specifications. — end note ]
atomic<int> x, y
y.store(1, memory_order_relaxed); //(1)
atomic_thread_fence(memory_order_seq_cst); //(2)
x.load(memory_order_relaxed); //(3)
memory_order_seq_cst
时产生相同的指令-这是顺序一致性,可防止StoreLoad重新排序, 情况2 :atomic<int> x, y;
y.store(1, memory_order_seq_cst); //(1)
x.load(memory_order_seq_cst); //(3)
LOCK
-prefix完全按照MFENCE
刷新Store-Buffer以防止StoreLoad重新排序DMB ISH
是完全屏障,可防止StoreLoad重新排序:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0024a/CHDGACJD.html Guide for ARMv8-A
Table 13.1. Barrier parameters
ISH
Any - AnyAny - Any This means that both loads and stores must complete before the barrier. Both loads and stores that appear after the barrier in program order must wait for the barrier to complete.
atomic_thread_fence(memory_order_seq_cst)
)相同memory_order_seq_cst
映射到不同的CPU体系结构:load()
,store()
和atomic_thread_fence()
:atomic_thread_fence(memory_order_seq_cst);
始终会生成完整屏障:MOV (into memory),
MFENCE
,LOAD- MOV (from memory)
,fence- MFENCE
MOV (into memory)
,LOAD- MFENCE
,MOV (from memory)
,栅栏-MFENCE
(LOCK) XCHG
,加载-MOV (from memory)
,栅栏-MFENCE
-全屏障 MOV (into memory)
,LOAD- LOCK XADD(0)
,栅栏-MFENCE
-全屏障 hwsync; st
,LOAD- hwsync;
ld; cmp; bc; isync
,fence- hwsync
st.rel;
mf
,LOAD- ld.acq
,fence- mf
dmb ish; str;
dmb ish
,LOAD- ldr; dmb ish
,fence- dmb ish
dmb ish; str
,LOAD- dmb ish;
ldr; dmb ish
,fence- dmb ish
STL
,LOAD- LDA
,栅栏-DMB ISH
-全屏障 STLR
,LOAD- LDAR
,栅栏-DMB ISH
-全屏障 sync; sw;
sync;
,LOAD- sync; lw; sync;
,fence- sync
store(memory_order_seq_cst)
和next load(memory_order_seq_cst)
)之间生成的指令与atomic_thread_fence(memory_order_seq_cst)
相同,所以atomic_thread_fence(memory_order_seq_cst)
阻止了StoreLoad的重新排序。
关于c++ - atomic_thread_fence(memory_order_seq_cst)是否具有完整内存屏障的语义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25478029/
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
我是一名优秀的程序员,十分优秀!