2009-04-04 2 views
34

Cercando di imparare asio, e sto seguendo gli esempi dal sito web.io_service, perché e come viene utilizzato?

Perché è necessario il servizio io_ e cosa fa esattamente? Perché devo inviarlo a quasi tutte le altre funzioni mentre eseguo operazioni asincrone, perché non può "creare" se stesso dopo il primo "binding".

risposta

46

Asio io_service è il facilitatore per il funzionamento su funzioni asincrone. Una volta che un'operazione asincrona è pronta, utilizza uno dei thread correnti di io_service per richiamarti. Se nessun thread esiste, usa il proprio thread interno per chiamarti.

Pensa a una coda contenente operazioni. Ti garantisce che tali operazioni, quando eseguite, lo faranno solo sui thread che hanno chiamato i suoi metodi run() o run_once(), o quando si tratta di socket e AS asincroni, il suo thread interno.

Il motivo per cui è necessario passarlo a tutti è fondamentalmente che qualcuno deve attendere che le operazioni asincrone siano pronte, e come indicato nella propria documentazione io_service è il collegamento ASIO al servizio I/O del sistema operativo in modo da asportare il i notificatori asincroni della stessa piattaforma, come kqueue, /dev/pool/, epoll e i metodi per operare su quelli, ad esempio select().

Principalmente finisco per utilizzare io_service per richiamare demultiplex da diverse parti del sistema e assicurarmi che operino sullo stesso thread, eliminando la necessità di un blocco esplicito, poiché le operazioni sono serializzate. È un idioma molto potente per le applicazioni asincrone.

È possibile dare uno sguardo allo core documentation per ottenere una migliore comprensione del motivo per cui è necessario io_service e che cosa fa.

+2

'In primo luogo finisco per usare io_service per richiamare demultiplex da diverse parti del sistema e assicurarmi che funzionino sullo stesso thread, (...)' Potresti per favore elaborare un po 'su questo idioma? – syntagma

+0

@ ΔλЛ pubblichi semplicemente le operazioni su io_service e quando arriva il momento di eseguirle, sceglierà il thread corretto ed eseguirà, magari serializzato se usi un filamento per avvolgere le operazioni. – Berkus