boost :: asio :: io_service :: poll()带来的麻烦

niX*_*man 4 c++ boost boost-asio

以下代码:

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

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;
}

/***************************************************************************/
Run Code Online (Sandbox Code Playgroud)

给出这样的输出:

**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**
Run Code Online (Sandbox Code Playgroud)

但是,根据文件:

poll()函数运行准备运行的处理程序,无需阻塞,直到io_service已停止或没有更多就绪处理程序.

poll() - 是一种非阻塞方法.有什么问题?

第二个问题:在文件中说:

return已执行的处理程序数.

如果它是非阻塞的,它将返回什么价值? - 队列中的对象数量? - 但这与"被执行的"不同.

adz*_*dzm 13

这是一个老问题,但你从未真正得到关于run vs poll的答案.

io_service对象::运行将继续,只要有事情做,比如等待一个最后期限定时器或IO完成通知,等等.这就是为什么有工作对象,以保持运行,从运行退出.

io_service :: poll只会执行就绪处理程序,并且在没有准备好调度的处理程序之前不会返回.

换句话说,不同的是,运行将等待挂起处理程序做好准备,就像一个定时器或IO完成通知,而民意调查在这种情况下返回.

如果要执行某些空闲处理,此行为很有用.