В чем разница между std:: condition_variable и std:: condition_variable_any?
Мне, вероятно, не хватает чего-то очевидного, но я не вижу никакой разницы между std::condition_variable
и std::condition_variable_any
. Зачем нам нужны оба?
Ответы
Ответ 1
std::condition_variable
является более специализированным и, следовательно, может быть более эффективным, если вам не нужна гибкость std::condition_variable_any
.
Из N3290 §30.5 [thread.condition]/1
Класс condition_variable
обеспечивает переменную условия, которая может ждать только объекта типа unique_lock<mutex>
, что позволяет эффективность на некоторых платформах. Класс condition_variable_any
предоставляет общую переменную условия, которая может ждать на объектах пользовательских типов блокировки.
На самом деле, в LLVM libС++, condition_variable_any
реализуется с использованием более специализированного condition_variable
(который использует pthread_cond_t) для shared_mutex.
Ответ 2
Разница - это параметр для функций wait()
. Все функции ожидания в std::condition_variable
принимают параметр блокировки типа std::unique_lock<std::mutex>&
, тогда как функции wait для 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);
}
}
Подробную информацию см. в документации по реализации потока just:: thread библиотеки потоков С++ 11:
std::condition_variable
документация
std::condition_variable_any
документация
или посмотрите последний публичный проект стандарта С++ 11