C++面试题更新 2026-08-05

在C++多线程编程中,为什么条件变量必须与互斥锁一起使用?请从实现机制和避免竞态条件的角度解释。

风险判断技术原理C++

考察说明

考察对C++条件变量与互斥锁协同工作原理的理解。

回答思路

  1. 【回答框架 1】条件变量本身不提供原子性的等待与唤醒操作,若不加锁,线程在判断条件与调用wait之间可能被其他线程插入修改共享状态的步骤,导致漏掉唤醒或虚假唤醒。
  2. 【回答框架 2】互斥锁保证共享状态的读写是互斥的,条件变量wait在原子操作中释放锁并阻塞,被唤醒后重新获取锁,确保从条件判断到等待再到条件判断的整个周期内共享数据的一致性。
  3. 【回答框架 3】标准库实现要求wait必须持有锁,wait会原子地释放锁并挂起线程,唤醒后重新加锁,这个设计消除了检查与等待之间的竞态窗口,否则无法可靠实现条件同步。
  4. 【回答框架 4】对比自旋锁或原子操作,条件变量结合锁能高效处理长时间等待,避免忙等待,同时锁机制保护共享状态不被并发修改破坏。
  5. 【回答框架 5】若不用锁,会出现条件已满足但线程因未持有锁而进入等待,导致死锁或永久等待,且无法安全访问共享数据。
  6. 【关键点 1】条件变量必须与互斥锁配对,wait在持有锁时调用并原子释放锁。
  7. 【关键点 2】锁保护共享状态,避免条件判断与等待之间的竞态。
  8. 【关键点 3】唤醒后需重新获取锁,确保后续操作安全。
  9. 【易错点 1】不能只用条件变量而不用锁,否则会引入数据竞争和漏唤醒。
  10. 【易错点 2】不要在持有锁时长时间执行耗时操作,以免阻塞其他线程。
  11. 【易错点 3】要使用while循环检查条件,防止虚假唤醒。