C++中wait_for方法的谓词内容是否受互斥锁保护?场景验证问询
C++中std::condition_variable::wait_for的谓词是否受互斥锁保护?
你的理解是错误的,wait_for的谓词执行时全程受互斥锁保护,代码里的countMe操作是线程安全的。
核心逻辑说明
std::condition_variable::wait_for的执行流程明确:
- 调用
wait_for时,当前线程已经持有传入的unique_lock(即代码中的lock)。 - 首先持有锁执行谓词:如果谓词返回
true,直接结束等待,锁保持持有状态。 - 若谓词返回
false,才会解锁互斥锁,进入等待状态(等待超时或被其他线程通知)。 - 当等待超时或被唤醒时,会重新获取互斥锁,再次执行谓词检查,此时锁依然是持有的。
针对你的代码分析
在你提供的代码中:
while (true) { std::unique_lock<std::mutex> lock(mtx_kill); cv_kill.wait_for(lock, 500ms, [&]() {++countMe; return killFlag; }); if (killFlag) { break; } }
每次执行lambda谓词里的++countMe时,当前线程都持有mtx_kill锁,多个线程不会同时修改countMe,不存在线程安全问题。
只有当谓词返回false(即killFlag为false)时,wait_for才会释放锁进入等待状态——但这个阶段不会执行谓词内的代码。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

