- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
据我所知,std::memory_order 枚举提供内存栅栏,但我需要确定每个 std::memory_order 枚举元素提供的栅栏。下面我按照我对每个 std::memory_order 枚举元素的理解进行解释:
关于前 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/
我有一个栅栏的 3D 模型。该模型包含 1 个起始柱和 1 个末端柱,中间有一个连接玻璃板。假设我希望能够指定任意长度的栅栏,并将其放置在虚拟世界中。如果可能的话,我将如何处理原始 3D 模型以将其更
x86指令lfence/sfence/mfence用于实现Linux内核中的rmb()/wmb()/mb()机制。很容易理解,这些用于序列化内存访问。但是,在遇到运行时行为中的错误之前,在编写代码时确
以下代码实现了一些无锁(且无原子!)的线程间通信,这些通信需要使用存储和加载内存屏障,但是C++ 11 release-acquire语义不适当,也不保证正确性。实际上,该算法暴露了对发布获取语义的某
我是一名优秀的程序员,十分优秀!