повысьте asio io_service.run ()

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

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

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

14
задан Sam Miller 19 March 2013 в 22:44
поделиться

1 ответ

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

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

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

.
19
ответ дан 1 December 2019 в 13:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: