Chapter 1 归纳总结 — 你好,并发世界

4 阅读3分钟

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)

两大动机:

  1. 分离关注点(Separation of Concerns, SOC)
    • 把"相关代码"与"无关代码"拆开,各用独立线程处理 → 程序更易理解、可测。
    • 典型:UI 线程与后台任务线程分工,用户交互不卡顿。
  2. 性能(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.mddoc/cia_ch4_sync_operations.mddoc/cia_ch5_atomic_summary.md