代码之家  ›  专栏  ›  技术社区  ›  niXman

boost::asio::io_service::poll()出现问题

  •  4
  • niXman  · 技术社区  · 16 年前

    以下代码:

    /***************************************************************************/
    
    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**
    

    但是,根据文件:

    函数的作用是:运行 准备好跑步了,没有障碍, 直到IO服务停止 或者不再有现成的处理程序。

    poll()-是非阻塞方法。 怎么了?

    第二个问题是: 在文件中,据说:

    返回 被处决了。

    如果它是非阻塞的,它将返回什么值?-队列中的对象数?-但这和“被处决”是不同的。

    2 回复  |  直到 12 年前
        1
  •  13
  •   adzm    15 年前

    这是一个古老的问题,但你从来没有真正得到关于跑步和投票的答案。

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

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

    换句话说,不同之处在于,运行将等待挂起的处理程序就绪,如计时器或IO完成通知,而轮询将在这种情况下返回。

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

        2
  •  4
  •   Alex F    16 年前

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

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

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

    推荐文章