In the official chat example, chat_client::write()
defers work to the io_service
via io_service::post()
, which will:
- request that the
io_service
execute the given handler via a thread that is currently invoking the poll()
, poll_one()
, run()
, or run_one()
function on the io_service
- not allow the given handler to be invoked within the calling function (e.g.
chat_client::write()
)
As only one thread is running the io_service
, and all socket read, write, and close operations are only initiated from handlers that have been posted to the io_service
, the program satisfies the thread-safety requirement for socket
.
class chat_client
{
void write(const chat_message& msg)
{
// The nullary function `handler` is created, but not invoked within
// the calling function. `msg` is captured by value, allowing `handler`
// to append a valid `msg` object to `write_msgs_`.
auto handler = [this, msg]()
{
bool write_in_progress = !write_msgs_.empty();
write_msgs_.push_back(msg);
if (!write_in_progress)
{
do_write();
}
};
// Request that `handler` be invoked within the `io_service`.
io_service_.post(handler);
}
};