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