Мне, вероятно, не хватает чего-то очевидного, но я не вижу никакой разницы между 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