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,都繞不開這些基礎問題:
- 任務什麼時候開始和結束?
- 多個任務之間怎樣傳遞結果?
- 誰擁有共享資料?
- 共享資料怎樣同步?
- 出錯、取消和退出時怎樣收尾?
把這些問題想清楚以後,再看並行和協程會順很多。