Зачем нам нужно использовать boost :: asio :: io_service :: work?

Пример использования boost :: asio.

  1. Почему в этом примере используется boost :: asio :: io_service :: work?
  2. И почему srv.run (); не вызывается для выполнения задач в streamах?
 int main() { boost::asio::io_service srv; boost::asio::io_service::work work(srv); boost::thread_group thr_grp; thr_grp.create_thread(boost::bind(&boost::asio::io_service::run, &srv)); thr_grp.create_thread(boost::bind(&boost::asio::io_service::run, &srv)); srv.post(boost::bind(f1, 123)); srv.post(boost::bind(f1, 321)); //sync srv.post(boost::bind(f2, 456)); srv.post(boost::bind(f2, 654)); //sync srv.stop(); thr_grp.join(); } 

Обновление: в чем разница между опросом и запуском, когда io_service используется без io_service :: work?

 int main() { boost::asio::io_service srv; //boost::asio::io_service::work work(srv); std::vector thr_grp; srv.post(boost::bind(f1, 123)); srv.post(boost::bind(f1, 321)); //sync srv.post(boost::bind(f2, 456)); srv.post(boost::bind(f2, 654)); //sync // What is the difference between the poll and run, when io_service without work? thr_grp.emplace_back(boost::bind(&boost::asio::io_service::poll, &srv));// poll or run? thr_grp.emplace_back(boost::bind(&boost::asio::io_service::run, &srv));// poll or run? srv.stop(); for(auto &i : thr_grp) i.join(); int b; std::cin >> b; return 0; } 

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

Метод io_service :: run указан в качестве указателя делегата или функции в методах create_thread. Итак, когда stream создается из метода create_thread, он вызывает метод io_service :: run и передает объект io_service в качестве аргумента. Обычно один объект io_service может использоваться с несколькими объектами сокета.

Метод остановки обычно вызывается при выключении приложения или когда связь между всеми клиентами / серверами больше не требуется, и не ожидается, что какие-либо новые подключения необходимо будет инициировать.

  • C # - Как преобразовать объект в IntPtr и обратно?
  • Использование AppDomain в C #
  • Каков самый элегантный способ чтения текстового файла с помощью c ++?
  • Безопасно ли push_back элемент из того же вектора?
  • Копировать конструктор и = перегрузка оператора в C ++: возможна ли общая функция?
  • Отключить classы JSON до C #
  • Должен ли я использовать static_cast или reinterpret_cast при запуске void * на все
  • Специализация шаблонов псевдонимов
  • Каков наилучший способ изменить список в цикле foreach?
  • Разница между C ++ 03 throw () specifier C ++ 11 noexcept
  • Чтение данных из SqlDataReader
  • Давайте будем гением компьютера.