跳到正文

Wiki

并发、并行与协程

约 2 分钟阅读

这一章放在一起讲三个容易混淆的概念:

  • 并发(concurrency):多个任务在同一段时间内都在推进,重点是程序结构和任务协调。
  • 并行(parallelism):多个任务在同一时刻真的同时执行,重点是利用多核或硬件能力提升吞吐。
  • 协程(coroutine):一种可以暂停和恢复的函数,重点是控制流表达,常用于异步 IO。

它们经常一起出现,但不是同一个东西。

并发:我有多个任务要安排
并行:我让多个任务真的同时跑
协程:我把一个任务写成可以暂停/恢复的流程

1.学习顺序

建议先看三个概念小节:

顺序 章节 作用
1 并发是什么 先理解多任务、线程、共享状态、同步和数据竞争
2 并行是什么 再理解多核同时执行、任务并行、数据并行和性能边界
3 协程是什么 最后理解可暂停函数、协作式调度和异步 IO 写法

然后再进入详细知识:

章节 当前状态
并发编程 已展开,包含 std::thread、mutex、atomic、条件变量、future、jthread、semaphore / latch / barrier
并行编程 后续补充
协程编程 后续补充

2.为什么不直接叫多线程

多线程只是实现并发和并行的一种方式。

例如:

  • 单核 CPU 上多个线程轮流执行,这是并发,但不是严格意义上的并行;
  • 多核 CPU 上多个线程同时计算,这是并发,也可能是并行;
  • 一个线程里用协程处理多个网络请求,这是并发,但未必有多个线程;
  • C++ 并行算法可能使用线程池或其他执行机制,但使用者不一定直接管理线程。

所以这一章用“并发、并行与协程”作为总入口,会比“多线程”更准确。

3.当前重点

现阶段先把 并发编程 学扎实。

因为无论后面学习并行算法还是协程异步 IO,都绕不开这些基础问题:

  1. 任务什么时候开始和结束?
  2. 多个任务之间怎样传递结果?
  3. 谁拥有共享数据?
  4. 共享数据怎样同步?
  5. 出错、取消和退出时怎样收尾?

把这些问题想清楚以后,再看并行和协程会顺很多。