В чем разница между std :: condition_variable и std :: condition_variable_any? - PullRequest
18 голосов
/ 06 января 2012

Я, вероятно, упускаю что-то очевидное, но я не вижу никакой разницы между std::condition_variable и std::condition_variable_any.Зачем нам оба?

Ответы [ 2 ]

18 голосов
/ 06 января 2012

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

Подробнее см. В документации по реализации just :: thread библиотеки потоков C ++ 11:

std::condition_variable документация

std::condition_variable_any документация

или ознакомьтесь с последним публичным проектом стандарта C ++ 11

15 голосов
/ 06 января 2012

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

Из N3290 §30.5 [условие резьбы] / 1

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

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

...