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
- 1. Jaka jest różnica między notify_all() a notify_one() of std :: condition_variable?
- 2. Jaka jest różnica między :: std :: string i std :: string?
- 3. Jaka jest różnica między std :: cout i std :: wcout?
- 4. Jaka jest praktyczna różnica między std :: nth_element a std :: sort?
- 5. Różnica między std: string i std :: string
- 6. Różnica między std :: uninitialized_copy & std :: copy?
- 7. std :: condition_variable dlaczego potrzebuje std :: mutex
- 8. jaka jest różnica między używaniem ATOMIC_FLAG_INIT i std :: atomic_flag :: wyraźny
- 9. C++ 11: dlaczego std :: condition_variable używa std :: unique_lock?
- 10. Jaka jest różnica między std :: string i std :: basic_string? I dlaczego oba są potrzebne?
- 11. Jaka jest różnica między std :: tie a std :: make_tuple z argumentami std :: ref?
- 12. Jaka jest różnica między std :: to_string, boost :: to_string i boost :: lexical_cast <std::string>?
- 13. Różnica: std :: runtime_error vs std :: exception()
- 14. Różnica między std :: vector i std :: array inicjatora wymienia
- 15. Różnica między std :: końca (myvector) i myVector.end()
- 16. Różnica między wektorami :: begin() i std :: begin()
- 17. Jaka jest złożoność pamięci std :: sort() i std :: sort_heap()?
- 18. Jaka jest różnica między sizeof i alignof?
- 19. Różnice między std :: is_integer i std :: is_integral?
- 20. Jaka jest różnica między ssize_t i ptrdiff_t?
- 21. std :: mem_fun vs std :: mem_fn
- 22. Jaka jest przyszłość std :: valarray?
- 23. Dlaczego std :: condition_variable powoduje, że planowanie jest niesprawiedliwe?
- 24. std :: mapowa różnica między wywołaniami indeksu i insertów
- 25. Jaka jest różnica między? : i ||
- 26. Jaka jest różnica między $ i $$?
- 27. Jak duża jest różnica w wydajności między std :: sort i std :: stable_sort w praktyce?
- 28. Jaka jest różnica między std :: initializer_list <int> ({1,2,3}) i {1,2,3}?
- 29. Jaka jest różnica między sposobami przypisywania wskaźnika?
- 30. Jaka jest podstawowa struktura std :: initializer_list?
Dzięki. To doprowadzało mnie do szału. Po prostu nie mogłem tego zobaczyć. –