In the official chat example, chat_client::write() defers work to the io_service via io_service::post(), which will:
- request that the io_serviceexecute the given handler via a thread that is currently invoking thepoll(),poll_one(),run(), orrun_one()function on theio_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);
  }
};