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_variable
proporciona 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_any
proporciona 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.