Ссылка, которую вы дали, является превосходным руководством о том, как использовать повышение:: библиотека asio.
Вы будете в состоянии сделать то, что вы хотите без многократных нитей, как только вы понимаете, как это работает.
Идея asio (асинхронный IO) состоит в том, чтобы отозвать вас, как только операция закончена объектом io_service. Каждый раз, когда вы называете aync_xxx, вы передаете к нему указатель функции (или функтор), который назовут, как только операция сделана. Таким образом у вас не должно быть отдельного блокирования нити при опросе iOS.
for example, you want to read a message from the server, once it is done. call do_something(Message& msg). That exactly what example code did.
Поскольку TCP - находящийся на потоке протокол без естественной границы сообщения, необходимо определить собственный формат сообщения на нем. В примере это определяет chat_message класс с этой целью.
Чтобы прочитать сообщения, клиент выполняет эти шаги, каждый из которых вызывается в результате отзыва после того, как предыдущая async_xxx операция сделана. это также полагается на то, что async_read полон только, когда точное число определенных байтов прочитано, или когда ошибка происходит.
- требование async_connect, передайте handle_connect как его отзыв.
- handle_connect называет async_read, проход handle_read_header как его отзыв
- handle_read_header называет async_read, проход handle_read_body как его отзыв.
- handle_read_body в конечном счете назовет async_read, передаст handle_read_header как его отзыв, так, чтобы процедура повторилась для следующего сообщения.
notice that, In the sample, it did "cout.write..." in step 4, before it invoke async_read. all you need to do is to replace the "cout.wirte.." part with your do_something(msg).
часть письма следует за подобной цепью отзывов, единственная разница - то, что цепь ломается, когда больше сообщения, чтобы написать, следовательно мы должны проверить условие и перезапустить его.