std::condition_variable_any 不存在,c++ 标准仅定义 std::condition_variable;它仅支持 std::unique_lock,不兼容 std::shared_lock 等其他锁类型,需用独立 mutex 保护条件状态。

标准库中没有 std::condition_variable_any —— 这个类型根本不存在。
为什么找不到 std::condition_variable_any?
C++ 标准只定义了两个条件变量类:
-
std::condition_variable:只能配合std::unique_lock<:mutex>使用 -
std::condition_variable_any:**不存在**。这是常见误解,可能源于对旧文档、拼写错误或某些非标准实现的混淆
你真正想用的,是 std::condition_variable(最常用)或极少数场景下需要更泛化的同步原语——但标准库不提供“any”版本。
如果需要等待任意可锁类型,怎么办?
std::condition_variable 要求锁类型必须满足 BasicLockable 且支持 lock()/unlock(),但实际只接受 std::unique_lock<:mutex>(或其兼容封装)。它不支持 std::shared_lock、std::scoped_lock 或自定义锁。
立即学习“C++免费学习笔记(深入)”;
若你确实需要在非 std::mutex 场景下做条件等待(例如与 std::shared_mutex 配合),标准做法是:
- 用
std::mutex单独保护条件变量本身和共享状态 - 让读写线程各自用对应锁(如
std::shared_lock)访问数据,但修改条件变量相关状态时仍走专用std::mutex - 避免强行把
std::shared_lock传给wait()—— 编译会直接报错:no matching member function for call to 'wait'
正确使用 std::condition_variable 的关键点
它不是“通用”的,但用对了很可靠。常见陷阱包括:
- 忘记在
wait()前加while循环检查谓词(spurious wakeup 导致逻辑错误) - 调用
notify_one()/notify_all()时不持有对应互斥锁(虽不强制,但易引发竞态) - 把
std::lock_guard传给wait()—— 必须是std::unique_lock,因为wait()会内部解锁/重锁 - 条件变量和关联的
std::mutex生命周期不一致(例如局部变量、提前析构)
最小可行示例:
std::mutex mtx; std::condition_variable cv; bool ready = false; // 等待线程 std::unique_lock lk(mtx); cv.wait(lk, []{ return ready; }); // 此时 lk 已重新锁定,ready 为 true // 通知线程 { std::lock_guard lk(mtx); ready = true; } cv.notify_one();
真正“通用”的条件等待在标准 C++ 中需自行组合:用独立互斥量保护条件状态,再配合任意锁管理业务数据。别被名字误导——std::condition_variable 的设计意图明确,就是和 std::mutex 绑定使用的原语。