Skip to content

Commit

Permalink
更新部门内存模型的内容,新建标题,搭建好基本的框架方便后续编写 #12
Browse files Browse the repository at this point in the history
  • Loading branch information
Mq-b committed Aug 13, 2024
1 parent d3da6fc commit f7bad1e
Showing 1 changed file with 59 additions and 0 deletions.
59 changes: 59 additions & 0 deletions md/05内存模型与原子操作.md
Original file line number Diff line number Diff line change
Expand Up @@ -720,3 +720,62 @@ C++ 标准通过内存序(memory order)来定义如何确保这种*可见*
也就是说:

- `std::mutex``unlock()` 操作*同步于*任何随后的 `lock()` 操作。这意味着,线程在调用 `unlock()` 时,对共享数据的修改会对之后调用 `lock()` 的线程*可见*

### `std::memory_order`

`std::memory_order` 是一个枚举类型,用来指定原子操作的内存顺序,影响这些操作的行为。

```cpp
typedef enum memory_order {
memory_order_relaxed,
memory_order_consume,
memory_order_acquire,
memory_order_release,
memory_order_acq_rel,
memory_order_seq_cst
} memory_order;

// C++20 起则为:

enum class memory_order : /* 未指明 */ {
relaxed, consume, acquire, release, acq_rel, seq_cst
};
inline constexpr memory_order memory_order_relaxed = memory_order::relaxed;
inline constexpr memory_order memory_order_consume = memory_order::consume;
inline constexpr memory_order memory_order_acquire = memory_order::acquire;
inline constexpr memory_order memory_order_release = memory_order::release;
inline constexpr memory_order memory_order_acq_rel = memory_order::acq_rel;
inline constexpr memory_order memory_order_seq_cst = memory_order::seq_cst;
```
这 6 个常量,每一个常量都表示不同的内存次序。
大体来说我们可以将它们分为三类。
1. `memory_order_relaxed` 宽松定序:不是定序约束,**仅对此操作要求原子性**。
2. `memory_order_seq_cst` 序列一致定序,这是库中所有原子操作的**默认行为**,也是**最严格的内存次序**,是**绝对安全**的。
剩下的就是第三类。
### 其它概念
<!--
思考,似乎还是得聊一下 cppreference 中提到的那些基础概念。
但是全写又太多,写的少点也不好弄,关键还得用自己的语言再修改一下。
修改顺序:写写连贯、读读连贯、读写连贯、写读连贯;以及各种操作,消费操作、获得操作、释放操作,还是肯定得说一下的。
-->
### `x86` 和 `ARM` 内存模型:强一致性与弱一致性
<!--
聊最广泛的 `x86` 与 `ARM` 这种,也顺便扯扯其它的架构,如 `RISC-V` 之类的,主要还是想稍微介绍下,聊点常识长长见识。
-->
### 宽松定序
### 释放-获取定序
### 释放-消费定序
### 序列一致定序
### 与 `volatile` 的关系

0 comments on commit f7bad1e

Please sign in to comment.