Wiki
併發是什麼
約 3 分鐘閱讀
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
併發(concurrency)關注的是:
多個任務如何在同一段時間內一起推進。
它不要求這些任務在同一時刻真的同時執行。
1.一個直觀理解
假設你在寫一個程式,它需要同時做幾件事:
接收网络数据
处理用户输入
更新内部状态
定时保存日志
這些任務不應該互相完全卡住。
即使 CPU 只有一個核心,作業系統也可以讓不同執行緒輪流獲得執行時間,讓這些任務看起來都在推進。
這就是併發最核心的感覺:
不是一件事做完再做下一件
而是多个任务交错推进
2.併發不等於並行
併發強調“任務組織方式”。
並行強調“是否真的同時執行”。
所以:
并发程序不一定并行
并行执行通常需要并发任务作为基础
例如單核 CPU 上跑多個執行緒,是併發;多核 CPU 上多個執行緒同時計算,才可能是並行。
3.C++ 中常見的併發工具
C++ 標準庫提供了很多併發工具,例如:
std::thread:建立和管理執行緒;std::mutex:保護共享狀態;std::lock_guard/std::unique_lock:用 RAII 管理鎖;std::atomic:對單個物件執行原子操作;std::condition_variable:讓執行緒等待某個條件發生;std::future/std::promise:線上程或任務之間傳遞未來結果;std::jthread/std::stop_token:更現代的執行緒生命週期和停止請求。
| 內容 | 學習優先順序 |
|---|---|
jthread + stop_token |
★★★★★ |
mutex + scoped_lock |
★★★★★ |
unique_lock |
★★★★★ |
atomic |
★★★★★ |
condition_variable |
★★★★☆ |
future / async |
★★★☆☆ |
promise |
★★☆☆☆ |
packaged_task |
★★☆☆☆ |
latch / barrier / semaphore |
★★☆☆☆ |
| 複雜 memory order / lock-free | ★☆☆☆☆ |
4.併發最容易出錯的地方
併發程式碼的難點通常不是“開一個執行緒”,而是:
- 執行緒什麼時候結束?
- 誰負責等待執行緒?
- 執行緒使用的物件會不會提前銷燬?
- 多個執行緒訪問同一份資料會不會發生資料競爭?
- 多把鎖會不會互相等待,產生死鎖?
所以學習併發時,重點不是追求執行緒越多越好,而是先保證程式行為正確。
5.本章對應內容
後面的併發程式設計詳細章節會繼續展開:
std::thread
mutex / lock_guard / unique_lock
std::atomic
condition_variable
future / async / promise
jthread / stop_token
semaphore / latch / barrier
這些內容屬於 C++ 標準庫併發基礎。