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++ 標準庫併發基礎。