Skip to content

Commit 0d281ef

Browse files
committed
1. 更新第二章使用线程的内容“当前环境支持并发线程数”
2. 修改第三章的前言与总结 3. 增加第四章的本章内容
1 parent 1694ee2 commit 0d281ef

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

md/02使用线程.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,36 @@ int main(){
4242

4343
如你所见,std::thread 高度封装,其成员函数也很少,我们可以轻易的创建线程执行任务,不过,它的用法也还远不止如此,我们慢慢介绍。
4444

45+
## 当前环境支持并发线程数
46+
47+
使用 [`hardware_concurrency`](https://zh.cppreference.com/w/cpp/thread/thread/hardware_concurrency) 可以获得我们当前硬件支持的并发线程数量,它是 `std::thread` 的静态成员函数。
48+
49+
```cpp
50+
#include <iostream>
51+
#include <thread>
52+
53+
int main(){
54+
unsigned int n = std::thread::hardware_concurrency();
55+
std::cout << "支持 " << n << " 个并发线程。\n";
56+
}
57+
```
58+
59+
本节其实是要普及一下计算机常识,一些古老的书籍比如 csapp 应该也会提到“**[超线程技术](https://www.intel.cn/content/www/cn/zh/gaming/resources/hyper-threading.html)**”。
60+
61+
> 英特尔® 超线程技术是一项硬件创新,允许在每个内核上运行多个线程。更多的线程意味着可以**并行**完成更多的工作。
62+
>
63+
> AMD 超线程技术被称为 SMT(Simultaneous Multi-Threading),它与英特尔的技术实现有所不同,不过使用类似。
64+
65+
举个例子:一款4核心8线程的CPU,这里的8线程其实是指所谓的*逻辑处理器*,也意味着这颗CPU最多可并行执行8个任务。
66+
67+
我们的 `hardware_concurrency()` 获取的值自然也会是 **8**
68+
69+
当然了,都2024年了,我们还得考虑一个问题:“ *英特尔从12代酷睿开始,为其处理器引入了全新的“**大小核**”混合设计架构*”。
70+
71+
比如我的 CPU `i7 13700H` 它是14核心,20线程,有6个能效核,6个性能核。不过我们说了,物理核心这个通常不看重, `hardware_concurrency()` 输出的值会为 20。
72+
73+
- **在进行多线程编程的时候,我们可以参考此值确定我们要创建的线程数量**
74+
4575
## 线程管理
4676

4777
在 C++ 标准库中,只能管理与 `std::thread` 关联的线程,类 `std::thread` 的对象就是指代线程的对象,我们说“线程管理”,其实也就是管理 `std::thread` 对象。

md/03共享数据.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
- 多线程共享数据的问题
66

7-
- 使用互斥量保护共享数据
7+
- 使用互斥量保护共享数据
88

99
- 保护共享数据的其它方案
1010

@@ -779,6 +779,6 @@ void recursiveFunction(int count) {
779779
780780
## 总结
781781
782-
本章讨论了多线程的共享数据引发的恶性条件竞争会带来的问题。并说明了可以使用互斥量(`std::mutex`)保护共享数据,并且要注意互斥量上锁的“**粒度**”。C++标准库提供了很多工具,包括管理互斥量的管理类(`std::lock_guard`),但是互斥量只能解决它能解决的问题,并且它有自己的问题(**死锁**)。同时我们讲述了一些避免死锁的方法和技术与。还讲了一下互斥量所有权转移。然后讨论了面对不同情况保护共享数据的不同方式,使用 `std::call_once()` 保护共享数据的初始化过程,使用读写锁(`std::shared_mutex`)保护不常更新的数据结构。以及特殊情况可能用到的互斥量 `recursive_mutex`,有些人可能喜欢称作:**递归锁**
782+
本章讨论了多线程的共享数据引发的恶性条件竞争会带来的问题。并说明了可以使用互斥量(`std::mutex`)保护共享数据,并且要注意互斥量上锁的“**粒度**”。C++标准库提供了很多工具,包括管理互斥量的管理类(`std::lock_guard`),但是互斥量只能解决它能解决的问题,并且它有自己的问题(**死锁**)。同时我们讲述了一些避免死锁的方法和技术。还讲了一下互斥量所有权转移。然后讨论了面对不同情况保护共享数据的不同方式,使用 `std::call_once()` 保护共享数据的初始化过程,使用读写锁(`std::shared_mutex`)保护不常更新的数据结构。以及特殊情况可能用到的互斥量 `recursive_mutex`,有些人可能喜欢称作:**递归锁**
783783
784784
下一章,我们将开始讲述同步操作,会使用到 [**Futures**](https://zh.cppreference.com/w/cpp/thread#.E6.9C.AA.E6.9D.A5.E4.BD.93)[**条件变量**](https://zh.cppreference.com/w/cpp/thread#.E6.9D.A1.E4.BB.B6.E5.8F.98.E9.87.8F)等设施。

md/04同步操作.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,9 @@
33
"同步操作"是指在计算机科学和信息技术中的一种操作方式,其中不同的任务或操作按顺序执行,一个操作完成后才能开始下一个操作。在同步操作中,各个任务之间通常需要相互**协调和等待**,以确保**数据的一致性和正确性**
44

55
本章的主要内容有:
6+
7+
- 条件变量
8+
9+
- `std::future` 等待异步任务
10+
11+
- 在规定时间内等待

0 commit comments

Comments
 (0)