Увеличить asio io_service.run()

Я просто перешел к asio пример чата. Мой вопрос заключается в их использовании функции io_service.run(). Документация для функции io_service.run() говорит:

Функция run() блокирует, пока все работы не закончатся, и нет больше обработчиков, которые будут отправлены, или пока io_service не будет остановился. Несколько потоков могут вызвать функцию run() для настройки пул потоков, из которого io_service может выполнять обработчики. Все потоки, ожидающие в пуле, эквивалентны, а io_service может выбрать любой из них для вызова обработчика. Функция run() может быть безопасно вызван снова, как только он завершится только после вызова reset().

В нем говорится, что функция run вернется, и я предполагаю, что когда он вернет сетевой поток, остановится, пока он не будет вызван снова. Если это так, то почему функция запуска не вызывается в цикле или, по крайней мере, не имеет собственного потока? функция io_service.run() для меня довольно загадка.

Ответы

Ответ 1

"до тех пор, пока все работы не будут завершены, и больше обработчиков не будет отправлено, или пока io_service не будет остановлен"

Обратите внимание, что вы DO устанавливаете обработчик с именем handle_accept, который переустанавливает себя при каждом выполнении. Следовательно, io_service.run никогда не вернется, по крайней мере, до тех пор, пока вы не выйдете из него вручную.

В принципе, в настоящий момент вы запускаете io_service.run в потоке, проактор io_services берет на себя поток программы, используя установленный вами обработчик. С этого момента вы обрабатываете программу на основе событий (например, handle_accept) вместо обычного процедурного потока программы. Цикл, который вы упоминаете, находится где-то глубоко в страшных глубинах проактора asio; -).