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

在 C++ 并发编程中,使用条件变量时常见的两类问题是信号丢失和虚假唤醒。请说明这两类问题的成因,并给出相应的解决策略或编程模式。

考察说明

考察对 C++ 条件变量使用中经典问题的理解及正确编程模式。

回答思路

  1. 【回答框架 1】信号丢失指通知在等待之前发出导致等待者永远阻塞。多种原因:notify 先于 wait;等待条件不满足但通知已丢失;使用 notify_one 而多个线程等待同一条件。解决核心是使用谓词循环判断条件,通过 wait(lock, pred) 或 wait 循环确保条件满足后再继续。
  2. 【回答框架 2】虚假唤醒指即使没有 notify,线程也可能被唤醒。这是底层实现允许的行为,可能导致条件不满足时继续执行。因此在唤醒后必须重新检查条件,使用 while 循环而非 if,这是标准用法。
  3. 【回答框架 3】使用 unique_lock 配合条件变量,等待期间自动释放锁,唤醒后重新获取。使用 wait(lock, pred) 可简化代码,内部封装了循环检查。确保所有修改共享条件的操作都在同一互斥锁保护下,并且 notify 在修改条件后调用,位置不影响正确性,但可能影响性能。
  4. 【回答框架 4】在 C++11 及以后的标准库中,条件变量与 unique_lock 结合可以可靠地避免上述问题。若使用自定义锁或其他同步原语,需特别小心。
  5. 【关键点 1】使用 while 循环或 wait(lock, pred) 处理虚假唤醒并规避信号丢失。
  6. 【关键点 2】条件变量必须与互斥锁配合使用,修改条件需在锁保护下。
  7. 【关键点 3】notify 在条件修改后调用,notify_all 用于唤醒多个等待者。
  8. 【易错点 1】误以为 notify 一定先于 wait 而使用 if 导致阻塞或误执行。
  9. 【易错点 2】忽略虚假唤醒,在条件不满足时继续处理。
  10. 【易错点 3】等待条件时使用互斥锁保护,但条件判断可能仅依赖部分变量而遗漏关联状态。