跳到正文

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. 出錯、取消和退出時怎樣收尾?

把這些問題想清楚以後,再看並行和協程會順很多。