2009-12-30 3 views
14

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

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

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

+0

Проверьте также ответ здесь: http://stackoverflow.com/questions/4705411/boostasio-io-service-run-vs-poll-or-how-do-i-integrate-boostasio-in -ma – serxio

ответ

19

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

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

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

+0

Старый вопрос, надеюсь, я получу здесь ответ, поскольку это кажется уместным. Как насчет ситуации с клиентом, где нет обработчика приема? Я пытаюсь написать клиента с asio, и я зациклился на том, как io_service.run() вписывается. – Endophage

+0

@Endophage, извините, что я долгое время работал с boost :: asio, поэтому я не могу найти ответ от моей головы, попробуйте задать вопрос заново. –

+0

Без проблем, спасибо за кружение назад. – Endophage

Смежные вопросы