2012-01-06 19 views

Respuesta

12

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

+0

Gracias. Me estaba volviendo loco. Simplemente no pude verlo. –

16

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

Cuestiones relacionadas