2012-11-04 2 views

ответ

9

Операции io_service::run() будут выполняться до тех пор, пока выполняются асинхронные операции. Если в любой момент нет ожидающих ожидающих асинхронных операций (или вызываемых обработчиков), вызов run() будет возвращен.

Однако есть некоторые проекты, которые предпочли бы, чтобы вызов run() не был завершен до тех пор, пока все работы не будут выполнены, и io_service явно проинструктирован, что с ним можно выйти. Для этого используется io_service::work. Создавая объект work (обычно я делаю это в куче и shared_ptr), io_service считает, что всегда есть что-то ожидающее, и поэтому метод run() не вернется. Как только я хочу, чтобы служба могла выйти (обычно во время выключения), я уничтожу рабочий объект.

+0

Уничтожить, используя функцию reset()? – lucastamoios

+2

Обычно, если я использую shared_ptr для работы, тогда да, я вызываю 'reset()' на shared_ptr. –

6

io_service::work является базовым классом для всех работ, которые могут вывешенные к экземпляру io_service, например, когда вы работаете с сокетом и запуска асинхронного чтения, на самом деле вы добавляете work к io_service. Таким образом, вы обычно не использовать work напрямую, но есть одно исключения:

io_service::run вернется, как только нет больше работы, чтобы сделать, поэтому рассмотрит приложение, которое имеет некоторые производитель и потребители тема, производители иногда производят работы и разместите их в потребительских потоках с io_service::post, но если все будет завершено, то io_service::run вернется, и, возможно, ваш потребительский поток будет остановлен, поэтому вам потребуется произвольная работа, чтобы поддерживать io_service занятым, в этом случае вы можете напрямую использовать io_service::work.

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