Non credo che si possa fare qualcosa di simile con boost :: thread. Forse perché le variabili di condizione POSIX non consentono questo tipo di costrutto. Naturalmente, Windows ha WaitForMultipleObjects come aJ postato, che potrebbe essere una soluzione se sei disposto a limitare il tuo codice alle primitive di sincronizzazione di Windows.
Un'altra opzione dovrebbe utilizzare un numero inferiore di variabili di condizione: è sufficiente disporre di una variabile di condizione che si attiva quando si verifica qualcosa di "interessante". Poi, ogni volta che vuoi aspettare, esegui un ciclo che controlla se la tua particolare situazione di interesse si è manifestata e, in caso contrario, torna ad aspettare sulla variabile condition. Si dovrebbe essere in attesa su quelle variabili di condizione in un tale ciclo in ogni modo, come attese variabili condizioni sono soggetti a wakeups spurie (da docs boost :: thread, sottolineatura mia):
void wait(boost::unique_lock<boost::mutex>& lock)
...
Effetti:
Chiamare atomicamente lock.unlock()
e blocca il thread corrente. Il thread verrà sbloccato quando viene notificato da una chiamata a this->notify_one()
o this->notify_all()
o spuriamente. ...
Mi sembra che avere una terza variabile di condizione per "1 o 2 cambiato" sia davvero l'approccio migliore. Un altro approccio è quello di convertire l'attesa su condizione in attesa sui descrittori di file utilizzando select e utilizzare pipe per la comunicazione thread. Poiché questa domanda è generica (non spiega quali sono le cose che sono state attese), non è chiaro se la selezione sarà migliore. –
Il problema con l'utilizzo di una variabile di condizione è l'incapsulamento. Non puoi avere funzioni come 'GoStyleChannel :: receive_but_break_if (condition_variable & cv, function & pred)'. In altre parole, supponiamo di avere una funzione di blocco che utilizza già una variabile di condizione. Vuoi che blocchi fino a quando non si verifica la condizione * o * che si verifica la tua condizione. Non puoi farlo senza avere un globale 'std :: condition_variable somethingHasHappenedSomewhere', che è davvero una schifezza. – Timmmm