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