什么是std :: condition_variable和std :: condition_variable_any之间的区别?

Joh*_*don 19 c++ std condition-variable c++11

我可能失去了一些东西很明显,但我看不到之间有什么区别std::condition_variablestd::condition_variable_any.为什么我们两个都需要?

Ant*_*ams 19

区别在于wait()函数的参数.所有等待函数都std::condition_variable采用类型的锁参数std::unique_lock<std::mutex>&,而等待函数std::condition_variable_any是所有模板,并采用类型的锁参数Lockable&,其中Lockable是模板参数.

这意味着std::condition_variable_any可以使用用户定义的互斥锁和锁类型,以及诸如boost::shared_lock具有lock()unlock()成员函数的任何东西.

例如

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅C++ 11线程库的just :: thread实现的文档:

std::condition_variable 文件

std::condition_variable_any 文件

或查看最新的C++ 11标准公开草案


ken*_*ytm 15

std::condition_variable更专业,因此当你不需要灵活性时可以更有效率std::condition_variable_any.

来自N3290§30.5[thread.condition]/1

Class condition_variable提供了一个条件变量,它只能在类型的对象上等待unique_lock<mutex>,从而在某些平台上实现最高效率.Class condition_variable_any提供了一个通用条件变量,可以等待用户提供的锁类型的对象.

实际上,在LLVM的libc ++中,condition_variable_any使用condition_variableshared_mutex上更专业的(使用pthread_cond_t)来实现.