跳到正文

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