跳到正文

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.併發最容易出錯的地方

併發程式碼的難點通常不是“開一個執行緒”,而是:

  1. 執行緒什麼時候結束?
  2. 誰負責等待執行緒?
  3. 執行緒使用的物件會不會提前銷燬?
  4. 多個執行緒訪問同一份資料會不會發生資料競爭?
  5. 多把鎖會不會互相等待,產生死鎖?

所以學習併發時,重點不是追求執行緒越多越好,而是先保證程式行為正確。

5.本章對應內容

後面的併發程式設計詳細章節會繼續展開:

std::thread
mutex / lock_guard / unique_lock
std::atomic
condition_variable
future / async / promise
jthread / stop_token
semaphore / latch / barrier

這些內容屬於 C++ 標準庫併發基礎。