【发布时间】:2014-12-14 17:30:09
【问题描述】:
在 gcc 下,有以下指令可用于设置内存屏障。它们都提供不同的“保护”
asm volatile("" ::: "memory"); // compiler reorder
asm volatile("mfence" ::: "memory"); // memory reordering
简而言之,C++ 原子提供:
- acquire/release semantics
- Sequentially-consistent ordering
我想知道 gcc 原语和 C++ 原子语义之间是否存在直接映射? (例如(一定是错误的,只是为了解释),获取/释放语义是为了防止编译器重新排序,而顺序一致的排序是为了防止内存重新排序)
或者也许 C++ 没有这个区别?该语言仅提供适用于同时重新排序的语义?
【问题讨论】:
-
要实现 C++ 原子,编译器必须以正确的顺序发出代码指令(即避免某些可用于非原子的优化),和知道目标硬件的内存排序和可见性,并可能发出额外的指令以实现 C++ 做出的预期保证。