Chapter 1 归纳总结 — 你好,并发世界
来源:simonhancrew.github.io/CppConcuren… (对应《C++ Concurrency in Action》第 1 章 "Hello, concurrency world") 本章是全书的开篇:先讲清楚**"为什么要用并发"、什么叫并发,再给出第一个能跑的多线程程序。 不涉及任何同步原语,核心是动机 + 认知**,而不是 API。看懂本章,才知道后面的 mutex/atomic/线程 到底在解决什么"成本 vs 收益"的问题。
结构:1.1 何谓并发 → 1.2 为什么使用并发 → 1.3 并发和多线程 → 1.4 开始入门 → 1.5 本章总结。
1. 何谓并发(1.1)
- 并发(concurrency): 两个或多个独立的活动同时存在。真正"同时做"还是"交替做"取决于硬件。
- 一个程序内多线程共享同一内存 → 每个线程是一段独立控制流,可读写公共数据。
- 并发 ≠ 并行:
- 并发:结构上"多个活动在推进"(可在一个核上交替/分时执行);
- 并行(parallelism):同时执行多个活动,需要多核/多处理器硬件支撑。
- 单核上只能并发(时间片切换),多核上既能并发也能并行。
2. 为什么使用并发(1.2)
两大动机:
- 分离关注点(Separation of Concerns, SOC)
- 把"相关代码"与"无关代码"拆开,各用独立线程处理 → 程序更易理解、可测。
- 典型:UI 线程与后台任务线程分工,用户交互不卡顿。
- 性能(Performance)—— "没有免费的午餐"
- 芯片时钟提速见顶,程序不再"换颗 CPU 就自动变快";想提速必须利用多核。
- 两种并行化方式:
- 任务并行(task parallelism):把一个大任务拆成若干块并行跑,缩短总耗时;
- 数据并行(data parallelism):多线程各自处理不同的数据块,执行同一种操作(可扩展性好)。
表格:并行方式
| 方式 | 怎么做 | 优点 |
|---|---|---|
| 任务并行 | 任务拆块,并行运行 | 降低总运行时间 |
| 数据并行 | 每线程处理不同数据块 | 易并行、可扩展 |
3. 什么时候不使用并发(1.2.3)
"收益比不上成本"就不该用:
- 代码更难读、更难维护,共享数据要小心保护;
- 启动线程有固有开销,很短的任务单线程反而更快;
- 线程越多越耗资源,过多线程耗尽系统资源/内存;
- 过多线程 → 上下文切换(切换)过多 → 整体性能反而下降。
结论:只有应用里"性能关键部分"才值得并发化。(本书承认的选择标准)
4. 第一个并发程序(1.4,清单 1.1)
#include <iostream>
#include <thread> // ① 声明多线程支持
void hello() // ② 新线程的起点函数
{
std::cout << "Hello Concurrent World\n";
}
int main()
{
std::thread t(hello); // ③ 构造 std::thread 即启动新线程
t.join(); // ④ 主线程等 t 结束
}
关键点
- 每个 C++ 程序至少有一个线程:跑
main()的初始线程;其它线程在std::thread对象的构造函数里指定起点函数。 <thread>头文件放多线程管理;保护共享数据的同步类在其它头文件(<mutex>等)。join():让创建线程等待std::thread所建线程执行完。若无join(),主线程可能在新线程打印前就结束 → 输出丢/未定义行为。- 本例只是个单词输出,主线程闲着 —— 属于 1.2.3 说的"不值得并发化"的例子。
std::thread对象只是线程句柄;真正执行在线程自己的内存空间。
5. 本章总结(1.5)
- 并发 = 多活动推进,不等于并行(并行要硬件支持);
- 用并发的两大理由 = 关注点分离 + 性能(利用多核);
- 不使用并发的情况 = 收益比不上成本(难维护、启动开销、切换过多);
- 看会第一个
std::thread t(func); t.join();程序,建立"线程构造即启动、join 等待"的心智模型。
与后续章节的衔接
- 第 2 章 讲如何启动/管理线程(join/detach、传参、所有权);
- 第 3 章 讲如何保护共享数据(mutex) —— first 并发真正开始"hard 的部分";
- 第 4-7 章 依次是同步操作、内存模型/原子、锁-free。
参考:仓库 doc/cia_ch2_thread_management.md、doc/cia_ch4_sync_operations.md、doc/cia_ch5_atomic_summary.md。