File tree Expand file tree Collapse file tree 3 files changed +38
-2
lines changed Expand file tree Collapse file tree 3 files changed +38
-2
lines changed Original file line number Diff line number Diff line change @@ -42,6 +42,36 @@ int main(){
42
42
43
43
如你所见,std::thread 高度封装,其成员函数也很少,我们可以轻易的创建线程执行任务,不过,它的用法也还远不止如此,我们慢慢介绍。
44
44
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
+
45
75
## 线程管理
46
76
47
77
在 C++ 标准库中,只能管理与 ` std::thread ` 关联的线程,类 ` std::thread ` 的对象就是指代线程的对象,我们说“线程管理”,其实也就是管理 ` std::thread ` 对象。
Original file line number Diff line number Diff line change 4
4
5
5
- 多线程共享数据的问题
6
6
7
- - 使用互斥量保护共享数据。
7
+ - 使用互斥量保护共享数据
8
8
9
9
- 保护共享数据的其它方案
10
10
@@ -779,6 +779,6 @@ void recursiveFunction(int count) {
779
779
780
780
## 总结
781
781
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 ` ,有些人可能喜欢称作:** 递归锁** 。
783
783
784
784
下一章,我们将开始讲述同步操作,会使用到 [ ** 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 ) 等设施。
Original file line number Diff line number Diff line change 3
3
"同步操作"是指在计算机科学和信息技术中的一种操作方式,其中不同的任务或操作按顺序执行,一个操作完成后才能开始下一个操作。在同步操作中,各个任务之间通常需要相互** 协调和等待** ,以确保** 数据的一致性和正确性** 。
4
4
5
5
本章的主要内容有:
6
+
7
+ - 条件变量
8
+
9
+ - ` std::future ` 等待异步任务
10
+
11
+ - 在规定时间内等待
You can’t perform that action at this time.
0 commit comments