Пытаюсь разобрать пример асинхронного чата с офф. сайта:
async_client
async_server
chat_message
Я вроде бы полностью понял клиент, кроме 2-х своих вопросов, которые сильно меня мучают, а именно:
1) io_service::run в отдельном потоке работает как конечный автомат, по принципу очереди, где она коллекционирует асинхронные вызовы. Чтобы io_service.run() не завершался, после подключения, он начинает прослушивать сокет сервера, ожидая сообщение, вот листинг (для подробностей сморите код async_client):
void do_read_header()
{
boost::asio::async_read(socket_,
boost::asio::buffer(read_msg_.data(), chat_message::header_length),
[this](boost::system::error_code ec, std::size_t /*length*/)
{
if (!ec && read_msg_.decode_header())
{
do_read_body();
}
else
{
socket_.close();
}
});
}
Однако в потоке функции main, пользователь начинает ввод и добавляет новую задачу в io_service, а именно следующий листинг (для подробностей сморите код async_client) :
void do_write()
{
boost::asio::async_write(socket_,
boost::asio::buffer(write_msgs_.front().data(),
write_msgs_.front().length()),
[this](boost::system::error_code ec, std::size_t /*length*/)
{
if (!ec)
{
write_msgs_.pop_front();
if (!write_msgs_.empty())
{
do_write();
}
}
else
{
socket_.close();
}
});
}
Но почему async_read не перекрывает async_write? Они же происходят в одном потоке (это я залогировал), почему вытащив async_read из этой очереди и ожидая сообщение, он может одновременно и отправлять сообщения, когда пользователь кладет ему операцию async_write?
2) Потребляют ли операции ресурсы при исполнении, подобные read/async_read/read_some и тп? Или же они работают по принципу condition_variable::wait?