В чем разница между 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