variable thread cplusplus condition_variable c++ c++11 std condition-variable

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 tipo unique_lock<mutex> , lo que permite la máxima eficiencia en algunas plataformas. Class condition_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.