在WinAPI、POSIX或API-OS等价物的其他扩展中,是否存在来自C++11的所有级别的内存屏障
Is there in WinAPI, POSIX, or in other extensions of API-OS equivalents to all levels of memory barriers from C++11?
在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
};
ADDITION:WinAPI中的一个例子是MemoryBarrier(),但它仅相当于std::atomic_thread_fence( std::memory_order_seq_cst );
。因为Windows主要在x86系统上工作,在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禁用此编译器优化吗?
通常不属于API标准的一部分,但在大多数编译器中以一种或另一种形式提供内部函数。
例如,Visual Studio编译器有_ReadBarrier
、_ReadWriteBarrier
和_WriteBarrier
。(我只链接了一个,因为从那个页面到其他页面都有链接。不,这些不是你列出的所有级别,但它们都是x86的级别……std::memory_order
中的列表也涵盖了一堆其他架构。[很明显,memory_order_relaxed
"什么都没有"]。
GCC有一种不同类型的内置功能,其目的是提供原子更新,而不是专门的屏障。
然而,一般来说,我会让编译器/OS来处理原子事物——使用std::atomic<>
和类似的东西。
几乎可以肯定不是。该标准的目标是覆盖所有偶然性;指定所需的最小值编译器在其环境中提供满足要求。
至于编译器优化:我想编译器可以将这些参数求值为原子函数,并使优化取决于它,但我怀疑大多数编译器将使用一个简单得多的规则:不重新排序内存访问(在编译器级别)与对原子的访问交叉类型
我不确定你想要什么编译器优化使残废如果编译器符合Posix,它将禁用所有内存访问的重新排序CCD_ 11功能;可能会跨越整个系统功能。(想象一下,如果它重新排序了对缓冲区的写入在对write
的调用之后,或者在调用read
。)
- 目标c是否需要一个标准来定义像c++11这样的内存模型
- 如何在 C++11 的内存池中分配 std::map 的内部RB_tree节点?
- 实际上,C++11 中 std::atomic 的内存占用量是多少?
- 在 C++11 线程中,std::mutex 对内存可见性有什么保证?
- 从 C++11 代码中获取系统内存和 CPU 使用率
- C++ 11 通过在类声明中使用指针来节省内存
- 如何在<N>不发生内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset*>?
- 从函数安全返回和处理动态分配的内存,C++ 11
- 发行语义中的内存操作 - C 11的内存顺序
- 我应该使用哪种 c++11 范例来最小化内存使用量并最小化复制?
- C11/C++11 内存型号
- 关于C++11内存模型的奇怪结果(放松排序)
- C++编译器如何支持C++11原子,但不支持C++11内存模型
- C++11 内存模型是否可以防止内存撕裂和冲突?
- 对C++11内存模型有什么好的解释
- C++11内存池类-从void*进行static_casting的解决方法
- 并发:用于多线程环境中共享变量的C++11内存模型
- Java内存模型和c++ 11内存模型有什么相似之处?
- C++DirectX 11内存管理与发布ShaderResourceView有关
- C++11内存排序-差异