c++ - thread - ¿Cuál es la diferencia entre std:: condition_variable y std:: condition_variable_any?
condition variable cplusplus (2)
Probablemente me esté perdiendo algo obvio, pero no puedo ver ninguna diferencia entre std::condition_variable y std::condition_variable_any . ¿Por qué necesitamos los dos?
La diferencia es el parámetro para las funciones de wait() . Todas las funciones de espera en std::condition_variable toman un parámetro de bloqueo de 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 de tipo Lockable& , donde Lockable es un parámetro de plantilla.
Esto significa que std::condition_variable_any puede trabajar con los tipos de bloqueo y mutex definidos por el usuario, y con cosas como boost::shared_lock --- cualquier cosa que tenga funciones de miembro lock() y unlock() .
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 implementación de solo :: subproceso de la biblioteca de subprocesos de C ++ 11 para obtener detalles:
std::condition_variable documentación
std::condition_variable_any documentación
o echa un vistazo al último borrador público del estándar C ++ 11
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
La clase
condition_variableproporciona una variable de condición que solo puede esperar en un objeto de tipounique_lock<mutex>, lo que permite la máxima eficiencia en algunas plataformas. Classcondition_variable_anyproporciona una variable de condición 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 usando la condition_variable más especializada (que usa pthread_cond_t) en un shared_mutex.