首先,我想列出我对此的一些理解,如果我错了,请指正。
MFENCE
可以确保完全屏障顺序一致性可防止重新排序STORE-STORE,STORE-LOAD,LOAD-STORE和LOAD-LOAD
根据Wikipedia。
[std::memory_order_seq_cst
不能保证阻止STORE-LOAD重新排序。
这是根据Alex's answer,“可能会将早期存储的负载重新排序到不同的位置”(对于x86,并且不会始终添加mfence。
std::memory_order_seq_cst
是否表示顺序一致性?根据第2/3点,对我来说似乎不正确。 std::memory_order_seq_cst
仅在
MFENCE
添加到LOAD
或STORE
否则,仍可能有重新订购。
根据@LWimsey的评论,我在这里犯了一个错误,如果LOAD
和STORE
均为memory_order_seq_cst
,则没有重新排序。 Alex可能指出了使用非原子或非SC的情况。
[std::atomic_thread_fence(memory_order_seq_cst)
总是生成全屏]
这是根据Alex's answer。所以我总是可以用asm volatile("mfence" ::: "memory")
std::atomic_thread_fence(memory_order_seq_cst)
这对我来说很奇怪,因为memory_order_seq_cst
在原子函数和篱笆函数之间的用法似乎有很大不同。
现在我进入实现了std::atomic_thread_fence
的MSVC 2015标准库的头文件中的此代码>
inline void _Atomic_thread_fence(memory_order _Order) { /* force memory visibility and inhibit compiler reordering */ #if defined(_M_ARM) || defined(_M_ARM64) if (_Order != memory_order_relaxed) { _Memory_barrier(); } #else _Compiler_barrier(); if (_Order == memory_order_seq_cst) { /* force visibility */ static _Uint4_t _Guard; _Atomic_exchange_4(&_Guard, 0, memory_order_seq_cst); _Compiler_barrier(); } #endif }
所以我的主要问题是
_Atomic_exchange_4(&_Guard, 0, memory_order_seq_cst);
如何创建完整的屏障MFENCE
,或者实际上做了什么来启用类似的机制,例如MFENCE
,因为_Compiler_barrier()
在这里显然不足以构成完整的内存屏障,或者该语句的工作原理与第3点类似?
首先,我想列出我对此的一些理解,如果我错了,请纠正我。 x86中的MFENCE可以确保完整的屏障顺序一致性防止对STORE-STORE进行重新排序,...
只是因为将C ++栅栏实现为生成特定的汇编级栅栏,并且通常需要生成一个,这并不意味着您可以四处寻找内联asm并用C ++指令替换显式的asm栅栏!