顺序一致性和获取/发布语义有什么区别?
What is the difference between sequential consistency and acquire/release semantics?
据我所知,获取/释放语义充当顺序一致性和弱记忆模型(或"放松",如C++所说的"(所允许的无条件记忆重新排序自由之间的中间地带。简而言之:
- 获取语义可防止
read
的内存重新排序,并按程序顺序执行任何read
或write
操作; - 发布语义可防止
write
的内存重新排序,并按程序顺序排列在之前的任何read
或write
操作。
凉。但这些保证加在一起,对我来说看起来像是顺序一致性。顺序一致性提供了什么,而获取/释放语义一起不提供?你能举个例子吗?
在硬件方面,acq/rel 允许在一个线程内存储/重新加载,以便在其他线程全局可见之前将存储缓冲区中的值
存储转发。seq_cst强制存储缓冲区耗尽,然后 seq-cst 加载可以从同一线程重新加载 seq-cst 存储。
这是 https://preshing.com/20120515/memory-reordering-caught-in-the-act/的区别 - 在存储和重新加载之间添加完整的内存屏障是(在 x86 上(从acq_rel到seq_cst所需要的。
额外的是单个总修改顺序:https://en.cppreference.com/w/cpp/atomic/memory_order#Sequentially-consistent_ordering
相关文章:
- 在C++17中,引用const字符串的语义应该是什么
- 移动语义和深层/浅层复制之间有什么关系?
- 在C++中使用移动语义的正确方法是什么?
- 顺序一致性和获取/发布语义有什么区别?
- 函数作为变量的语义是什么 C++.
- testb $1, %al 的语义是什么
- C++什么是价值语义类?我看到类似"This component implements a fully value-semantic container class"类描述
- 模板化代码的语法和语义是什么C++
- C++11 中已删除成员函数的确切语义是什么?
- C++中的禁止值语义意味着什么
- 在具有移动语义的RAII类中,默认构造函数应该做什么
- 让接口程序化而不是语义化意味着什么
- 消除默认/删除移动/复制语义中涉及的样板的好方法是什么
- 在共享库中全局声明的非pod对象的语义是什么?
- 语义和顶点布局在D3D11中的意义是什么?
- 移动语义 - 它的全部内容是什么?
- 指向已分配对象的指针没有值语义是什么意思
- 在遵循pimpl设计模式的类中实现move语义的正确方法是什么?
- 我是否正确地使用了move语义?好处是什么?
- 什么是移动语义上下文中的"Regular Type"?