Appearance
C++ 并发与多线程专题
C++ 后端/客户端面试的第二部分经常考多线程:
std::thread、mutex、condition_variable、atomic、数据竞争、死锁。C++ 本身不考操作系统底层那么深,重点在「使用正确 + 原理」。
一、核心概念
- 线程与进程:进程是资源分配单位、线程是调度单位;同进程线程共享地址空间(堆/全局),各自独立栈。
- 数据竞争(data race):两个及以上线程同时访问同一内存,至少一个在写且未同步 → UB。
- 竞态条件(race condition):执行结果依赖交错顺序,即使无数据竞争也不一定正确。
二、常用同步工具
| 工具 | 用途 |
|---|---|
std::mutex / lock_guard / unique_lock | 互斥,RAII 自动解锁 |
std::atomic<T> | 原子变量(lock-free for 常用整数)、内存序 |
std::condition_variable | 条件等待 / 通知 |
std::future / std::promise | 一次性返回值通道 |
std::async | 异步任务 |
std::thread / jthread(C++20) | 线程,join 管理 |
shared_mutex(C++17) | 读写锁 |
call_once | 只执行一次 |
三、高频自测
- 多线程加锁怎么写?lock_guard vs unique_lock?
- 什么是死锁?四个必要条件 + 如何避免?
- 条件变量怎么用?为什么必须配合锁?虚假唤醒?
- 手写「线程安全单例」(双重检查 + 内存序 / call_once / 局部 static)。
- std::atomic 的内存序(seq_cst / acquire / release)?
- volatile 与 atomic 的关系?
- 生产者-消费者模型实现?
- 数据竞争如何用工具检测(TSan)?
子文档
| 文件 | 内容 |
|---|---|
hpc-intro.md | HPC 并发总览(线程数/Amdahl/避免争用) |
threads-basics.md | 线程、mutex、条件变量、生产者消费者 |
atomic-memoryorder.md | atomic 与内存序、volatile 对比 |
deadlock-singleton.md | 死锁、单例、锁的选择 |
thread-pool.md | 线程池(含工作窃取、手写) |
lockfree.md | 无锁编程(CAS/ABA/hazard) |
lock-optimize.md | 锁优化、假共享、自旋 vs 互斥、读写锁 |
parallel-algo.md | 并行算法、分治、任务图/流水线 |
coroutine.md | C++20 协程 co_await/机制 |