2012-01-06 3 views

ответ

12

std::condition_variable более специализирован и, следовательно, может быть более эффективным, если вам не нужна гибкость std::condition_variable_any.

От N3290 §30.5 [thread.condition]/1

Класс condition_variable обеспечивает переменное условие, которое может ждать только на объекте типа unique_lock<mutex>, что позволяет максимально эффективности на некоторых платформах. Класс condition_variable_any предоставляет общую переменную условия, которую может ждать на объектах типов блокировки пользователя.

На самом деле, в LIBC LLVM в ++ condition_variable_any реализуется с помощью более специализированных condition_variable (который использует pthread_cond_t) на shared_mutex.

+0

Благодарю. Это сводило меня с ума. Я просто не мог этого видеть. –

16

Разница заключается в параметре функции 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); 
    } 
} 

Смотрите документацию для всего :: потоков реализации C++ 11 библиотеки потоков для деталей:

std::condition_variable documentation

std::condition_variable_any documentation

или проверить latest public draft of the C++11 standard