Skip to content

Commit f7bad1e

Browse files
committed
更新部门内存模型的内容,新建标题,搭建好基本的框架方便后续编写 #12
1 parent d3da6fc commit f7bad1e

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

Diff for: md/05内存模型与原子操作.md

+59
Original file line numberDiff line numberDiff line change
@@ -720,3 +720,62 @@ C++ 标准通过内存序(memory order)来定义如何确保这种*可见*
720720
也就是说:
721721

722722
- `std::mutex``unlock()` 操作*同步于*任何随后的 `lock()` 操作。这意味着,线程在调用 `unlock()` 时,对共享数据的修改会对之后调用 `lock()` 的线程*可见*
723+
724+
### `std::memory_order`
725+
726+
`std::memory_order` 是一个枚举类型,用来指定原子操作的内存顺序,影响这些操作的行为。
727+
728+
```cpp
729+
typedef enum memory_order {
730+
memory_order_relaxed,
731+
memory_order_consume,
732+
memory_order_acquire,
733+
memory_order_release,
734+
memory_order_acq_rel,
735+
memory_order_seq_cst
736+
} memory_order;
737+
738+
// C++20 起则为:
739+
740+
enum class memory_order : /* 未指明 */ {
741+
relaxed, consume, acquire, release, acq_rel, seq_cst
742+
};
743+
inline constexpr memory_order memory_order_relaxed = memory_order::relaxed;
744+
inline constexpr memory_order memory_order_consume = memory_order::consume;
745+
inline constexpr memory_order memory_order_acquire = memory_order::acquire;
746+
inline constexpr memory_order memory_order_release = memory_order::release;
747+
inline constexpr memory_order memory_order_acq_rel = memory_order::acq_rel;
748+
inline constexpr memory_order memory_order_seq_cst = memory_order::seq_cst;
749+
```
750+
751+
这 6 个常量,每一个常量都表示不同的内存次序。
752+
753+
大体来说我们可以将它们分为三类。
754+
755+
1. `memory_order_relaxed` 宽松定序:不是定序约束,**仅对此操作要求原子性**。
756+
2. `memory_order_seq_cst` 序列一致定序,这是库中所有原子操作的**默认行为**,也是**最严格的内存次序**,是**绝对安全**的。
757+
758+
剩下的就是第三类。
759+
760+
### 其它概念
761+
762+
<!--
763+
思考,似乎还是得聊一下 cppreference 中提到的那些基础概念。
764+
但是全写又太多,写的少点也不好弄,关键还得用自己的语言再修改一下。
765+
修改顺序:写写连贯、读读连贯、读写连贯、写读连贯;以及各种操作,消费操作、获得操作、释放操作,还是肯定得说一下的。
766+
-->
767+
768+
### `x86` 和 `ARM` 内存模型:强一致性与弱一致性
769+
<!--
770+
聊最广泛的 `x86` 与 `ARM` 这种,也顺便扯扯其它的架构,如 `RISC-V` 之类的,主要还是想稍微介绍下,聊点常识长长见识。
771+
-->
772+
773+
### 宽松定序
774+
775+
### 释放-获取定序
776+
777+
### 释放-消费定序
778+
779+
### 序列一致定序
780+
781+
### 与 `volatile` 的关系

0 commit comments

Comments
 (0)