Confuso quando boost :: asio :: io_service executa o método blocks / unblocks

Sendo um iniciante total para Boost.Asio, estou confuso comio_service::run(). Eu agradeceria se alguém pudesse me explicar quando este método bloqueia / desbloqueia. As documentações afirmam:

orun() blocos de funções até que todo o trabalho tenha terminado e não haja mais manipuladores a serem despachados, ou até que oio_service foi parado.

Vários segmentos podem chamar orun() função para configurar um pool de threads a partir do qual oio_service pode executar manipuladores. Todos os encadeamentos que estão aguardando no conjunto são equivalentes eio_service pode escolher qualquer um deles para invocar um manipulador.

Uma saída normal dorun() função implica que oio_service objeto está parado (ostopped() função retorna true). Chamadas subseqüentes pararun(), run_one(), poll() oupoll_one() retornará imediatamente, a menos que haja uma chamada anterior parareset().

O que a seguinte declaração significa?

[...] não mais manipuladores para serem despachados [...]

Ao tentar entender o comportamento deio_service::run(), Me deparei com issoexemplo (exemplo 3a). Dentro disso, observo queio_service->run() bloqueia e aguarda ordens de serviço.

// WorkerThread invines io_service->run()
void WorkerThread(boost::shared_ptr<boost::asio::io_service> io_service);
void CalculateFib(size_t);

boost::shared_ptr<boost::asio::io_service> io_service(
    new boost::asio::io_service);
boost::shared_ptr<boost::asio::io_service::work> work(
   new boost::asio::io_service::work(*io_service));

// ...

boost::thread_group worker_threads;
for(int x = 0; x < 2; ++x)
{
  worker_threads.create_thread(boost::bind(&WorkerThread, io_service));
}

io_service->post( boost::bind(CalculateFib, 3));
io_service->post( boost::bind(CalculateFib, 4));
io_service->post( boost::bind(CalculateFib, 5));

work.reset();
worker_threads.join_all();

No entanto, no código a seguir que eu estava trabalhando, o cliente se conecta usando TCP / IP e os blocos de método de execução até que os dados sejam recebidos de forma assíncrona.

typedef boost::asio::ip::tcp tcp;
boost::shared_ptr<boost::asio::io_service> io_service(
    new boost::asio::io_service);
boost::shared_ptr<tcp::socket> socket(new tcp::socket(*io_service));

// Connect to 127.0.0.1:9100.
tcp::resolver resolver(*io_service);
tcp::resolver::query query("127.0.0.1", 
                           boost::lexical_cast< std::string >(9100));
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
socket->connect(endpoint_iterator->endpoint());

// Just blocks here until a message is received.
socket->async_receive(boost::asio::buffer(buf_client, 3000), 0,
                      ClientReceiveEvent);
io_service->run();

// Write response.
boost::system::error_code ignored_error;
std::cout << "Sending message \n";
boost::asio::write(*socket, boost::asio::buffer("some data"), ignored_error);

Qualquer explicação derun() que descreve seu comportamento nos dois exemplos abaixo seria apreciado.

questionAnswers(2)

yourAnswerToTheQuestion