我可能遗漏了一些明显的东西,但我看不出std::condition_variable
和std::condition_variable_any
之间有任何区别。为什么我们需要两者?
答案 0 :(得分:18)
差异是wait()
函数的参数。 std::condition_variable
中的所有等待函数都采用std::unique_lock<std::mutex>&
类型的锁定参数,而std::condition_variable_any
的等待函数都是模板,并采用Lockable&
类型的锁定参数,其中Lockable
是模板参数。
这意味着std::condition_variable_any
可以使用用户定义的互斥锁和锁类型,以及boost::shared_lock
之类的内容 - 具有lock()
和unlock()
成员函数的任何内容
e.g。
std::condition_variable_any cond;
boost::shared_mutex m;
void foo() {
boost::shared_lock<boost::shared_mutex> lk(m);
while(!some_condition()) {
cond.wait(lk);
}
}
有关详细信息,请参阅C ++ 11线程库的just :: thread实现的文档:
std::condition_variable
documentation
答案 1 :(得分:15)
std::condition_variable
更专业,因此当您不需要std::condition_variable_any
的灵活性时可以更有效率。
来自N3290§30.5[thread.condition] / 1
班级
condition_variable
提供 一个条件变量,只能等待unique_lock<mutex>
类型的对象,允许最大值 某些平台的效率。类condition_variable_any
提供了一般条件变量 可以等待用户提供的锁类型的对象。
实际上,在LLVM的libc ++中,condition_variable_any
是使用shared_mutex上更专业的condition_variable
(使用pthread_cond_t)实现的。