【问题标题】:troubles with boost::asio::io_service::poll()boost::asio::io_service::poll() 的问题
【发布时间】:2014-01-12 03:41:05
【问题描述】:

以下代码:

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

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 处理程序的数量 被处决了。

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

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

    这是一个老问题,但你从来没有真正得到关于运行与民意调查的答案。

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

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

    换句话说,不同之处在于 run 将等待待处理的处理程序准备好,例如计时器或 IO 完成通知,而 poll 将在这种情况下返回。

    如果您想执行一些空闲处理,此行为很有用。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 事实是 poll() 直到所有处理程序都完成后才会返回控件。
      • 非阻塞的意思是:长时间不动手,不包含无休止的等待。阻塞操作将执行挂起的处理程序并通过等待下一个处理程序来阻塞。当队列为空时,非阻塞操作返回。异步操作开始一些处理(可能在另一个线程中)并立即返回。同步操作仅在所有工作完成后才返回。您将非阻塞操作理解为异步。 poll 函数是非阻塞和同步的。
      • 好的。请解释一下run()和poll()的区别?在我的示例中,我看不出有什么区别。
      • 在以下代码中: void func1(int c) { for ( int i = 0; i
      猜你喜欢
      • 2011-06-16
      • 1970-01-01
      • 2017-09-17
      • 2012-11-26
      • 2011-12-18
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多