Предотвратить возврат boost :: asio :: io_context, когда больше нет работы - PullRequest
0 голосов
/ 18 февраля 2019

boost::asio::io_context::run() возвращается, когда работа не ожидается.Я хотел бы избежать такого поведения, так что run() действительно ждет новых работ бесконечно, с возможностью остановить его из другого потока.

Это можно сделать, я полагаю, запустив бесконечно длинный таймерв io_context и вызовом cancel() в этом таймере, когда мы хотим, чтобы run() вернул.

Это правильный подход и есть ли чистый способ сделать это?

1 Ответ

0 голосов
/ 18 февраля 2019

Вы можете использовать executor_work_guard .В ctor он берет executor из экземпляра io_context и вызывает on_work_started для этого исполнителя, что означает, что io_context::run не заканчивается, когда нет работы, которую нужно выполнить см. Ссылку .

Это гарантирует, что функции run () и run_one () io_context не завершаются во время работы.

Таким образом, простой код выглядит как

  boost::asio::io_context io;
  boost::asio::executor_work_guard<decltype(io.get_executor())> work{io.get_executor()};

  io.run(); // [1]
  cout << "you will never see this line" << endl;

, код висит в 1 строка.io_context::run может закончиться, когда вызывается деструктор work.

В более старых версиях boost или asio эквивалентный класс: io_service :: work

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...