gpt4 book ai didi

c++ - C++ 中的 std::memory_order 究竟提供了哪些栅栏?

转载 作者:行者123 更新时间:2023-11-28 01:37:20 24 4
gpt4 key购买 nike

据我所知,std::memory_order 枚举提供内存栅栏,但我需要确定每个 std::memory_order 枚举元素提供的栅栏。下面我按照我对每个 std::memory_order 枚举元素的理解进行解释:

  1. std::memory_order_relaxed - 未提供围栏
  2. std::memory_order_acquire - LoadLoad_LoadStore
  3. std::memory_order_release - LoadStore_StoreStore
  4. std::memory_order_consume - 通常等于 memory_order_acquire
  5. std::memory_order_acq_rel - LoadLoadLoadStore_LoadStoreStoreStore ???
  6. std::memory_order_seq_cst - StoreLoad_StoreLoad ???

关于前 4 个元素,我不确定。但是关于最后两个元素,我什么都不知道。

有人知道吗?

此外,我需要知道在使用 std::atomic 或 std::atomic_flag 时编译器将内存栅栏放在哪个位置?

据我了解,使用带有原子的栅栏意味着应用栅栏并执行操作。我对吗?例如:

atomic.load(std::memory_order_acquire);

意味着应用 memory_order_acquire 栅栏并以原子方式加载数据?

最佳答案

Anyone exactly knows about that?

当然,有多种来源,例如C++ Reference :

memory_order_relaxed — 宽松操作:没有对其他读取或写入施加同步或顺序约束,仅保证此操作的原子性。

memory_order_consume — 具有此内存顺序的加载操作对受影响的内存位置执行消耗操作:在当前线程中,依赖于当前加载的值的读取或写入不能在此加载之前重新排序。在释放相同原子变量的其他线程中写入数据相关变量在当前线程中是可见的。在大多数平台上,这只会影响编译器优化。

memory_order_acquire — 具有此内存顺序的加载操作对受影响的内存位置执行获取操作:在此加载之前,当前线程中的读取或写入操作无法重新排序。所有在其他线程中释放同一个原子变量的写入在当前线程中都是可见的。

memory_order_release — 具有此内存顺序的存储操作执行释放操作:在此存储之后,当前线程中的任何读取或写入都不能重新排序。当前线程中的所有写入在获取相同原子变量的其他线程中可见,并且携带对原子变量的依赖性的写入在使用相同原子的其他线程中变得可见。

memory_order_acq_rel — 具有此内存顺序的读取-修改-写入操作既是获取操作又是释放操作。当前线程中的内存读取或写入不能在此存储之前或之后重新排序。所有在其他线程中释放同一个原子变量的写入在修改前可见,并且修改在其他获取相同原子变量的线程中可见。

memory_order_seq_cst — 具有此内存顺序的加载操作执行获取操作,存储执行释放操作,read-modify-write 执行获取操作和释放操作,加上单个存在所有线程以相同顺序观察所有修改的全序。

请同时查看 atomic<> Weapons presentation by Herb Sutter ,这解释了很多。

Also, I need know in which place compiler puts memory fence

这是依赖于架构的。在某些架构上,它是一个空操作,在一些架构上,它是一个指令前缀,在一些架构上,它是加载/存储之前/之后的特殊指令。

有一篇论文叫"Memory Barriers: a Hardware View for Software Hackers" ,如果您有兴趣,它会分析许多架构的障碍。

For example: atomic.load(std::memory_order_acquire); means apply memory_order_acquire fence and load data atomically?

这也是依赖于架构的,但是对于获取屏障,我会说完全相反:我们加载一个变量,然后我们确保在加载之前没有进一步的读/写,即放置一个栅栏。

但在某些平台上,它可能是单处理器指令。例如,在 ARM 上有加载获取 (LDA) 和存储释放 (STL) 指令。

关于c++ - C++ 中的 std::memory_order 究竟提供了哪些栅栏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48724698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com