Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::asio::io_服务::poll()的问题_C++_Boost_Boost Asio - Fatal编程技术网

C++ boost::asio::io_服务::poll()的问题

C++ boost::asio::io_服务::poll()的问题,c++,boost,boost-asio,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 " <

以下代码:

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

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

/***************************************************************************/
但是,根据文件:

函数的作用是:运行 准备好运行,无阻塞, 直到io_服务停止 或者没有更多现成的处理程序

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

第二个问题: 文件中说:

返回所需的处理程序数 他们被处决了


如果它是非阻塞的,它将返回什么值?-队列中的对象数?-但这与“已执行的”不同。

非阻塞与异步不同。池同步运行准备运行的处理程序,并在不阻塞和等待其他处理程序的情况下返回

补充说明。 阻塞输入操作是在未找到输入数据时启动无休止等待的操作。考虑读取操作,它应该从某个端口读取一个字节,但是没有传入的数据。在这种情况下,Read调用挂起,仅在收到字节时返回。如果没有输入信息,非阻塞读取操作将立即返回


池操作是非阻塞的。它同步执行所有挂起的请求和返回。如果没有传入请求,poll将立即返回。

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

io_服务::只要有事情要做,run就会继续运行,例如等待截止时间计时器或io完成通知等。这就是为什么有工作对象要阻止run退出的原因

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

换句话说,run将等待挂起的处理程序准备就绪,比如计时器或IO完成通知,而poll将在这种情况下返回


如果要执行一些空闲处理,此行为非常有用

事实上,poll()在所有处理程序完成之前不会返回控件。非阻塞意味着:它不会长时间手动,也不会包含无休止的等待。阻塞操作将执行挂起的处理程序,并通过等待下一个处理程序进行阻塞。当队列为空时,非阻塞操作返回。异步操作启动一些处理(可能在另一个线程中)并立即返回。同步操作仅在所有工作完成时返回。您将非阻塞操作理解为异步操作。轮询功能是非阻塞和同步的。ok。请解释run()和poll()之间的区别?在我的示例中,我看不到区别。在以下代码中:void func1(int c){for(int I=0;I**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**