No creo que puedas hacer algo como esto con boost :: thread. Tal vez porque las variables de condición POSIX no permiten este tipo de constructo. Por supuesto, Windows tiene WaitForMultipleObjects como AJ publicado, lo que podría ser una solución si está dispuesto a restringir su código a las primitivas de sincronización de Windows.
Otra opción sería usar menos variables de condición: solo tiene 1 variable de condición que se activa cuando ocurre algo "interesante". Luego, cada vez que desee esperar, ejecuta un ciclo que verifica si su situación particular de interés ha surgido, y si no, vuelva a esperar la variable de condición. Usted debe estar esperando en esas variables de condición en un bucle tal de todos modos, como se espera estado variable está sujeta a activaciones falsas (de documentos impulso :: hilo, el énfasis es mío):
void wait(boost::unique_lock<boost::mutex>& lock)
...
Efectos:
Llamada atomicamente lock.unlock()
y bloquea el hilo actual. El hilo se desbloqueará cuando se lo notifique mediante una llamada a this->notify_one()
o this->notify_all()
, o falsamente. ...
Me parece que tener una tercera variable de condición para "cambiar 1 o 2" es de hecho el mejor enfoque. Otro enfoque consiste en convertir la condición de espera en esperar en los descriptores de archivos usando select y usar pipes para la comunicación de subprocesos. Dado que esta pregunta es genérica (no explica en qué se esperaban las cosas), no está claro que seleccionar será mejor. –
El problema con el uso de una variable de condición es la encapsulación. No puede tener ninguna función como 'GoStyleChannel :: receive_but_break_if (condition_variable & cv, function & pred)'. En otras palabras, supongamos que tiene alguna función de bloqueo que ya usa una variable de condición. Desea que se bloquee hasta que suceda la condición * o * su condición suceda. No se puede hacer sin tener una 'estándar :: variable_condición_algo algoHapantada_en_salida_, que en realidad es una porquería. – Timmmm