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></:mutex>使用 -
std::condition_variable_any:**不存在**。这是常见误解,可能源于对旧文档、拼写错误或某些非标准实现的混淆
你真正想用的,是 std::condition_variable(最常用)或极少数场景下需要更泛化的同步原语——但标准库不提供“any”版本。
如果需要等待任意可锁类型,怎么办?
std::condition_variable 要求锁类型必须满足 BasicLockable 且支持 lock()/unlock(),但实际只接受 std::unique_lock<:mutex></: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<std::mutex> lk(mtx);
cv.wait(lk, []{ return ready; });
// 此时 lk 已重新锁定,ready 为 true
// 通知线程
{
std::lock_guard<std::mutex> lk(mtx);
ready = true;
}
cv.notify_one();
真正“通用”的条件等待在标准 C++ 中需自行组合:用独立互斥量保护条件状态,再配合任意锁管理业务数据。别被名字误导——std::condition_variable 的设计意图明确,就是和 std::mutex 绑定使用的原语。











