Skip to content

C++ 并发与多线程专题

C++ 后端/客户端面试的第二部分经常考多线程:std::threadmutexcondition_variableatomic、数据竞争、死锁。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只执行一次

三、高频自测

  1. 多线程加锁怎么写?lock_guard vs unique_lock?
  2. 什么是死锁?四个必要条件 + 如何避免?
  3. 条件变量怎么用?为什么必须配合锁?虚假唤醒?
  4. 手写「线程安全单例」(双重检查 + 内存序 / call_once / 局部 static)。
  5. std::atomic 的内存序(seq_cst / acquire / release)?
  6. volatile 与 atomic 的关系?
  7. 生产者-消费者模型实现?
  8. 数据竞争如何用工具检测(TSan)?

子文档

文件内容
hpc-intro.mdHPC 并发总览(线程数/Amdahl/避免争用)
threads-basics.md线程、mutex、条件变量、生产者消费者
atomic-memoryorder.mdatomic 与内存序、volatile 对比
deadlock-singleton.md死锁、单例、锁的选择
thread-pool.md线程池(含工作窃取、手写)
lockfree.md无锁编程(CAS/ABA/hazard)
lock-optimize.md锁优化、假共享、自旋 vs 互斥、读写锁
parallel-algo.md并行算法、分治、任务图/流水线
coroutine.mdC++20 协程 co_await/机制

C++ 面试八股 · VitePress 版