проблемы с boost :: asio :: io_service :: poll () - PullRequest
4 голосов
/ 07 июня 2010

следующий код:

/***************************************************************************/

boost::mutex m;

struct func {
   func(int v):n(v) {}
   void operator()() {
      {  boost::mutex::scoped_lock l(m);
         std::cout << "run function " << n << std::endl;
      }
      for ( int idx = 0; idx < 4; ++idx ) {
         {  boost::mutex::scoped_lock l(m);
            std::cout << "function " << n << ", ping " << idx << std::endl;
         }
         sleep(1);
      }
   }

private:
   int n;
};

/***************************************************************************/

int main(int argv, const char** argc) {
   boost::asio::io_service io;

   for ( int idx = 0; idx < 4; ++idx ) {
      io.post(func(idx));
   }

   std::cout << "before run" << std::endl;
   io.poll();
   std::cout << "after run" << std::endl;

   std::cin.get();

   return 0;
}

/***************************************************************************/

дает такой вывод:

**before run**
run function 0
function 0, ping 0
function 0, ping 1
function 0, ping 2
function 0, ping 3
run function 1
function 1, ping 0
function 1, ping 1
function 1, ping 2
function 1, ping 3
run function 2
function 2, ping 0
function 2, ping 1
function 2, ping 2
function 2, ping 3
run function 3
function 3, ping 0
function 3, ping 1
function 3, ping 2
function 3, ping 3
**after run**

но, согласно документации:

Функция poll () запускает обработчики, которые готовы к запуску, без блокировки, пока io_service не будет остановлен или больше нет готовых обработчиков.

poll () - это неблокирующий метод. в чем проблема?

и второй вопрос: в документации сказано, что:

return Количество обработчиков, которые были казнены.

если он неблокирующий, какое значение он вернет? - количество объектов в очереди? - но это не то же самое, что «казнили».

Ответы [ 2 ]

13 голосов
/ 11 декабря 2010

Это старый вопрос, но вы так и не получили ответ о запуске против опроса.

io_service :: run будет работать до тех пор, пока есть что-то сделать, например, ожидание по таймеру крайнего срока или уведомление о завершении ввода-вывода и т. Д. Вот почему существует рабочий объект, который не будет запускаться.

io_service :: poll будет выполнять только готовые обработчики и не вернется, пока не будет больше обработчиков, готовых к отправке.

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

Это поведение полезно, если вы хотите выполнить некоторую простаивающую обработку.

4 голосов
/ 07 июня 2010

Неблокирование не совпадает с асинхронным.пул синхронно запускает обработчики, готовые к запуску, и возвращает их, не блокируя и не ожидая других обработчиков.

Дополнительные пояснения.Блокирующая операция ввода - это операция, которая начинает бесконечное ожидание, если входные данные не найдены.Рассмотрим операцию чтения, которая должна считывать один байт с какого-либо порта, но входящие данные отсутствуют.В этом случае вызов Read зависает и возвращается только при получении байта.Неблокирующая операция чтения немедленно возвращается, если нет входной информации.

операция пула неблокирующая.Он синхронно выполняет все ожидающие запросы и возвращает.Если нет входящих запросов, опрос возвращается немедленно.

...