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

时间:2012-01-06 13:14:16

标签: c++ c++11 std condition-variable

我可能遗漏了一些明显的东西,但我看不出std::condition_variablestd::condition_variable_any之间有任何区别。为什么我们需要两者?

2 个答案:

答案 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

std::condition_variable_any documentation

或查看latest public draft of the C++11 standard

答案 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)实现的。