2012-01-06 23 views

Odpowiedz

12

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 typu unique_lock<mutex>, umożliwiając maksymalną wydajność w niektórych systemach. Klasa condition_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.

+0

Dzięki. To doprowadzało mnie do szału. Po prostu nie mogłem tego zobaczyć. –

16

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