Увеличить 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; -).