Autore Topic: Thread con attese multiple  (Letto 1754 volte)

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Thread con attese multiple
« il: 10 Agosto 2011, 20:31:09 »
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:

Codice: [Seleziona]
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:

Codice: [Seleziona]
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:

Codice: [Seleziona]
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?
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Thread con attese multiple
« Risposta #1 il: 10 Agosto 2011, 20:34:50 »
mmh... ammazzare il thread brutalmente, invece di chiederglielo con gentilezza, può essere un'opzione nel tuo caso?
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: Thread con attese multiple
« Risposta #2 il: 10 Agosto 2011, 20:43:13 »
Citazione da: "TheKaneB"
mmh... ammazzare il thread brutalmente, invece di chiederglielo con gentilezza, può essere un'opzione nel tuo caso?
No...because i thread c++2011 nn possono essere ammazzati brutalmente! :-(
(e poi, sono contro la violenza ingiustificata!)
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: Thread con attese multiple
« Risposta #3 il: 11 Agosto 2011, 09:45:35 »
Ma non c'è un modo per il thread padre inviare comandi al thread figlio usando il socket??
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline cdimauro

  • Human Debugger
  • *****
  • Post: 4291
  • Karma: +7/-95
    • Mostra profilo
Re: Thread con attese multiple
« Risposta #4 il: 11 Agosto 2011, 17:56:27 »
Penso sia possibile. Alla fine il thread padre è soltanto uno dei tanti client.

Tags: