Allora ho questo "problema": un thread che deve potersi "risvegliare" in 2 occasioni, quando riceve dati da un socket TCP/IP (implementato tramite BOOST asio) e dal thread padre per sapere quando deve smettere di aspettare i dati e "terminarsi".
Attualmente il thread richiama una funzione scritta da me per bloccarsi e aspettare che arrivino dati dal socket, qualcosa del tipo:
while (1)
{
string msg = revcMessageFromSocket();
//elaboro messaggio...
}
Pensavo di comunicare al thread in questione la sua terminazione, attraverso un qualche segnale del thread padre, per esempio un msg messo in una coda.
Quindi il ciclo di attesa dei messaggi del thread figlio diventerebbe qualcosa del genere:
while (recvMessageFromSocket() || wait_and_pop())
{
}
Questo ovviamente NON va bene; sia recvMessageFromSocket che wait_and_pop() (per prelevare eventuali messaggi dalla coda), sono bloccanti.
Ho pensato allora di non rendere bloccanti le due chiamate:
while (recvMessageNoBlocking() || tryPop())
{
}
in questo caso però il trhead continuerebbe a ritornare sempre sulle condizioni (che ora restituirebbero un bool) sprecando cicli macchina...
Sperando di essere stato chiaro, cosa mi suggerite di fare?