WinAPI、POSIX 或其他 API-OS 等效扩展中是否存在与 C++11 std::memory_order中所有级别的内存屏障的等效扩展,这些扩展定义了编译器和处理器管道重新排序操作时的优化限制?
enum memory_order {
memory_order_relaxed,
memory_order_consume,
memory_order_acquire,
memory_order_release,
memory_order_acq_rel,
memory_order_seq_cst
};
补充: WinAPI 中的一个示例是MemoryBarrier(),但它仅等效于std::atomic_thread_fence( std::memory_order_seq_cst );
. 因为 Windows 主要在 x86 系统上工作,普通加载具有获取语义,普通存储具有释放语义:http ://www.stdthread.co.uk/forum/index.php?topic=72.0
但是,即使缓存 L3 (LLC) 和 x86 的管道取消了重新排序优化,load()
并且store()
根据这些语义 -std::memory_order_acquire/std::memory_order_release
也需要禁用编译器优化。
它存在于WinAPI中:
_ReadBarrier 、_WriteBarrier 和 _ReadWriteBarrier编译器内在函数仅防止编译器重新排序。要防止 CPU 重新排序读取和写入操作,请使用 MemoryBarrier 宏。
GCC 中有用于内存模型感知原子操作的内置函数:
__ATOMIC_RELAXED 没有障碍或同步。
__ATOMIC_CONSUME 仅用于屏障和与另一个线程同步的数据依赖性。
__ATOMIC_ACQUIRE 提升代码的障碍并与来自另一个线程的释放(或更强大)语义存储同步。
__ATOMIC_RELEASE 阻止代码下沉并与来自另一个线程的获取(或更强)语义负载同步。
__ATOMIC_ACQ_REL 双向全屏障,并与另一个线程中的获取加载和释放存储同步。
__ATOMIC_SEQ_CST 双向全屏障,并与所有线程中的获取加载和释放存储同步。
我可以使用POSIX禁用此编译器优化吗?