跳到正文

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

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