Skip to content

Wiki

并发是什么

About 3 min read

An English translation is not available yet. The latest Simplified Chinese source is shown without triggering paid translation.

并发(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++ 标准库并发基础。