У меня, вероятно, отсутствует что-то очевидное, но я не вижу никакой разницы между std::condition_variable
и std::condition_variable_any
. Зачем нам нужны оба?В чем разница между std :: condition_variable и std :: condition_variable_any?
ответ
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.
Разница заключается в параметре функции 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
Благодарю. Это сводило меня с ума. Я просто не мог этого видеть. –