Prawdopodobnie brakuje mi czegoś oczywistego, ale nie widzę żadnej różnicy między std::condition_variable
a std::condition_variable_any
. Dlaczego potrzebujemy obu?Jaka jest różnica między std :: condition_variable i std :: condition_variable_any?
Odpowiedz
std::condition_variable
jest bardziej wyspecjalizowany, a zatem może być bardziej wydajny, gdy nie potrzebujesz elastyczności std::condition_variable_any
.
Z N3290 §30.5 [thread.condition]/1
klasy
condition_variable
zapewnia schorzeniu zmiennej, tylko czekać na obiekcie typuunique_lock<mutex>
, umożliwiając maksymalną wydajność w niektórych systemach. Klasacondition_variable_any
udostępnia ogólną zmienną warunku, na której może czekać na obiekty typów blokowanych przez użytkownika.
Faktycznie, w libc LLVM za ++, condition_variable_any
jest realizowany przy użyciu bardziej specjalistycznego condition_variable
(który używa pthread_cond_t) na shared_mutex.
Różnica jest parametrem funkcji wait()
. Wszystkie funkcje oczekiwania w std::condition_variable
przyjmują parametr blokady typu std::unique_lock<std::mutex>&
, natomiast funkcje oczekiwania dla std::condition_variable_any
są szablonami i przyjmują parametr blokady typu Lockable&
, gdzie Lockable
jest parametrem szablonu.
Oznacza to, że std::condition_variable_any
może pracować z zdefiniowanych przez użytkownika mutex i typów zamków, a takie rzeczy jak boost::shared_lock
--- wszystko co ma lock()
i unlock()
funkcji składowych.
np.
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);
}
}
Zobacz dokumentację do realizacji tylko :: gwintu C++ 11 biblioteki wątku o szczegóły:
std::condition_variable
documentation
std::condition_variable_any
documentation
lub sprawdź latest public draft of the C++11 standard
Dzięki. To doprowadzało mnie do szału. Po prostu nie mogłem tego zobaczyć. –