Asio's io_service
is the facilitator for operating on asynchronous functions. Once a async operation is ready, it uses one of io_service
's running threads to call you back. If no such thread exists it uses it's own internal thread to call you.
Think of it as a queue containing operations. It garantees you that those operations, when run, will only do so on the threads that called its run()
or run_once()
methods, or when dealing with sockets and async IO, it's internal thread.
The reason you must pass it to everyone is basically that someone has to wait for async operations to be ready, an as stated in it's own documentation io_service
is ASIO's link to the Operating System I/O service so it abstracts away the platform's own async notifiers, such as kqueue
, /dev/pool/
, epool
, and the methods to operate on those, such as select()
.
Primarily I end up using io_service to demultiplex callbacks from several parts of the system, and make sure they operate on the same thread, eliminating the need for explicit locking, since the operations are serialized. It is a very powerful idiom for asynchronous applications.
You can take a look at the core documentation to get a better feeling of why io_service
is needed and what it does.