2011-01-16 16 views
28

Attualmente sto cercando di utilizzare boost :: asio per alcuni semplici collegamenti in rete TCP per la prima volta, e già mi sono imbattuto in qualcosa che non sono davvero sicuro di come affrontare. Per quanto ne so io, il metodo io_service.run() è fondamentalmente un ciclo che viene eseguito finché non rimane più nulla da fare, il che significa che verrà eseguito fino a quando non rilascerò il mio piccolo oggetto server. Dato che ho già una sorta di installazione di mainloop, vorrei piuttosto aggiornare manualmente il loop di rete da lì solo per semplicità, e penso che io_service.poll() farebbe quello che voglio, un po 'come questo:Boost :: Asio: io_service.run() vs sondaggio() o come integrare boost :: asio in mainloop

void myApplication::update() 
{ 
    myIoService.poll(); 
    //do other stuff 
} 

questo sembra funzionare, ma io non so ancora se c'è un inconveniente da questo metodo dal momento che non sembra essere il modo comune di trattare con boost :: servizi asios io. È un approccio valido o dovrei piuttosto usare io_service.run() in un thread aggiuntivo non bloccante?

risposta

37

Utilizzare io_service::poll anziché io_service::run è perfettamente accettabile. La differenza è spiegata nella funzione documentation

il poll() possono inoltre essere utilizzati spedire gestori pronti, ma senza bloccare.

Nota che io_service::run bloccherà se c'è qualche work lasciato nella coda

La classe di lavoro viene utilizzata per informare il io_service quando il lavoro inizia e finiture. Ciò garantisce che la funzione run() io_service dell'oggetto() non venga interrotta mentre il lavoro è in corso, e che si interrompa quando non è disponibile il lavoro non terminato .

mentre io_service::poll non presenta questo comportamento, invoca solo gestori pronti. Si noti inoltre che è necessario richiamare io_service::reset in qualsiasi chiamata successiva a io_service:run o io_service::poll.

+9

'io_service' non viene necessariamente arrestato dopo il ritorno di' io_service :: poll'. Perché è necessario 'io_service :: reset' prima dei successivi' io_service :: run' o 'io_service: poll'? – updogliu

2

Uno svantaggio è che si effettuerà un ciclo occupato.

while(true) { 
    myIoService.poll() 
} 

utilizzerà il 100% della CPU. myIoService.run() utilizzerà 0% cpu.

myIoService.run_one() potrebbe fare quello che vuoi ma bloccherà se non c'è niente da fare.

+2

in effetti preferiresti eseguire in questo caso semplicistico ma nella situazione in cui esiste già un loop di eventi (ad esempio esegue il rendering in background o altre cose nei cicli di riserva) il sondaggio sarebbe preferibile in quanto non vuoi che il gioco si fermi ogni volta che esegui() blocchi. –