Wiki
并发、并行与协程
About 2 min read
An English translation is not available yet. The latest Simplified Chinese source is shown without triggering paid translation.
这一章放在一起讲三个容易混淆的概念:
- 并发(concurrency):多个任务在同一段时间内都在推进,重点是程序结构和任务协调。
- 并行(parallelism):多个任务在同一时刻真的同时执行,重点是利用多核或硬件能力提升吞吐。
- 协程(coroutine):一种可以暂停和恢复的函数,重点是控制流表达,常用于异步 IO。
它们经常一起出现,但不是同一个东西。
并发:我有多个任务要安排
并行:我让多个任务真的同时跑
协程:我把一个任务写成可以暂停/恢复的流程
1.学习顺序
建议先看三个概念小节:
| 顺序 | 章节 | 作用 |
|---|---|---|
| 1 | 并发是什么 | 先理解多任务、线程、共享状态、同步和数据竞争 |
| 2 | 并行是什么 | 再理解多核同时执行、任务并行、数据并行和性能边界 |
| 3 | 协程是什么 | 最后理解可暂停函数、协作式调度和异步 IO 写法 |
然后再进入详细知识:
| 章节 | 当前状态 |
|---|---|
| 并发编程 | 已展开,包含 std::thread、mutex、atomic、条件变量、future、jthread、semaphore / latch / barrier |
| 并行编程 | 后续补充 |
| 协程编程 | 后续补充 |
2.为什么不直接叫多线程
多线程只是实现并发和并行的一种方式。
例如:
- 单核 CPU 上多个线程轮流执行,这是并发,但不是严格意义上的并行;
- 多核 CPU 上多个线程同时计算,这是并发,也可能是并行;
- 一个线程里用协程处理多个网络请求,这是并发,但未必有多个线程;
- C++ 并行算法可能使用线程池或其他执行机制,但使用者不一定直接管理线程。
所以这一章用“并发、并行与协程”作为总入口,会比“多线程”更准确。
3.当前重点
现阶段先把 并发编程 学扎实。
因为无论后面学习并行算法还是协程异步 IO,都绕不开这些基础问题:
- 任务什么时候开始和结束?
- 多个任务之间怎样传递结果?
- 谁拥有共享数据?
- 共享数据怎样同步?
- 出错、取消和退出时怎样收尾?
把这些问题想清楚以后,再看并行和协程会顺很多。