Probablemente me falta algo obvio, pero no puedo ver ninguna diferencia entre std::condition_variable
y std::condition_variable_any
. ¿Por qué necesitamos ambos?¿Cuál es la diferencia entre std :: condition_variable y std :: condition_variable_any?
Respuesta
std::condition_variable
es más especializado, y por lo tanto puede ser más eficiente cuando no necesita la flexibilidad de std::condition_variable_any
.
De N3290 §30.5 [thread.condition]/1
Clase
condition_variable
proporciona una variable condición de que sólo se puede esperar en un objeto de tipounique_lock<mutex>
, lo que permite la máxima eficiencia en algunas plataformas. La clasecondition_variable_any
proporciona una variable de estado general que puede esperar en objetos de tipos de bloqueo proporcionados por el usuario.
En realidad, en libc de LLVM ++, condition_variable_any
se implementa utilizando los más especializados condition_variable
(que utiliza pthread_cond_t) en un shared_mutex.
La diferencia es el parámetro de las funciones wait()
. Todas las funciones de espera en std::condition_variable
toman un parámetro de bloqueo del tipo std::unique_lock<std::mutex>&
, mientras que las funciones de espera para std::condition_variable_any
son todas plantillas, y toman un parámetro de bloqueo del tipo Lockable&
, donde Lockable
es un parámetro de plantilla.
Esto significa que std::condition_variable_any
puede trabajar con exclusión mutua definida por el usuario y tipos de bloqueo, y con cosas como boost::shared_lock
--- cualquier cosa que tenga lock()
y unlock()
funciones miembro.
p. Ej.
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);
}
}
Consulte la documentación de la aplicación justa :: hilo de la biblioteca de subprocesos C++ 11 para más detalles:
std::condition_variable
documentation
std::condition_variable_any
documentation
o echa un vistazo a la latest public draft of the C++11 standard
- 1. ¿Cuál es la diferencia entre std :: merge y std :: set_union?
- 2. ¿Cuál es la diferencia entre std :: valarray y std :: array
- 3. ¿Cuál es la diferencia entre std :: set y std :: vector?
- 4. ¿Cuál es la diferencia entre notify_all() y notify_one() de std :: condition_variable?
- 5. ¿Cuál es la diferencia entre std :: string y std :: basic_string? ¿Y por qué se necesitan ambos?
- 6. ¿Cuál es la diferencia entre std :: string :: c_str y std :: string :: data?
- 7. ¿Cuál es la diferencia práctica entre std :: nth_element y std :: sort?
- 8. ¿Cuál es la diferencia entre std :: quick_exit y std :: abort y por qué se necesitó std :: quick_exit?
- 9. Diferencia: std :: runtime_error vs std :: exception()
- 10. Diferencia entre std :: result_of y decltype
- 11. Cuál es la diferencia entre std :: multimap <key, value> y std :: map <key, std :: set <value>>
- 12. ¿Cuán grande es la brecha de rendimiento entre std :: sort y std :: stable_sort en la práctica?
- 13. std :: mem_fun vs std :: mem_fn
- 14. Cómo convertir CString y :: std :: string :: std :: wstring entre sí?
- 15. ¿Existe una diferencia operativa entre std :: set :: iterator y std :: set :: const_iterator?
- 16. std :: this_thread :: yield() vs std :: this_thread :: sleep_for()?
- 17. ¿Cuál es la lógica detrás de std :: bind y std :: thread siempre copiando argumentos?
- 18. ¿Cuál es el propósito de std :: make_pair frente al constructor de std :: pair?
- 19. std :: mapa y std :: unordered_map
- 20. ¿Cuál es la diferencia entre cstdlib y stdlib.h?
- 21. std :: vector versus std :: array en C++
- 22. ¿Cuál es la diferencia entre ssize_t y ptrdiff_t?
- 23. std :: move entre std :: string y std :: vector <unsigned char>
- 24. std :: diferencia de mapa entre llamadas de inserción e índice
- 25. ¿Cuál es la diferencia entre printf y std :: ostream debajo de la consola ventanas con UTF-8 salida
- 26. ¿Cuál es la diferencia entre {0} y ""?
- 27. Cuál es la diferencia entre = y: =
- 28. ¿Cuál es la diferencia entre .ToString (+) y ""
- 29. Cuál es la diferencia entre $ (...) y `...`
- 30. ¿cuál es la diferencia entre:.! y: r !?
Gracias. Me estaba volviendo loco. Simplemente no pude verlo. –