循环调用 boost io_service poll

Posted

技术标签:

【中文标题】循环调用 boost io_service poll【英文标题】:call boost io_service poll in a loop 【发布时间】:2014-06-12 17:43:40 【问题描述】:

我目前正在尝试使用 boost::asio 从这样的循环中手动更新我的程序的一部分:

class A

   A::A() : m_io() 

   A::update()
   
     m_io.poll();
     //do other stuff
   

   A::postSomething()
   
     while(1)
     
       m_io.post(...);
       sleep(1000);
     
   


void main()

  A a;

  boost::thread thr(boost::bind(&A::postSomething, &a));

  while(1)
  
    a.update();
  

如果我运行程序,则不会处理 post()。但是,如果我像这样在类成员 update() 中添加 m_io.reset():

A::update()

  m_io.poll();
  //do other stuff
  m_io.reset();
 

这似乎可行,但我仍然想知道这样做是否正确???我是否会因为 reset() 而失去 post() 调用的风险?

谢谢。

【问题讨论】:

当你说“没有 post() 被处理”时,你的意思是你打电话给post,然后你打电话给poll,并没有完成任何一项已发布的工作打电话给poll? 是的,就是这样,调用poll之后不会调用post回调。 你能生成一个完整的、可编译的、最小的测试用例来证明问题吗? 你应该构造一个 work 对象来保持 io_service 活着。 你希望sleep(1000)做什么? 【参考方案1】:

以下是如何使用工作对象的演示:Live On Coliru

#include <iostream>
#include <boost/asio.hpp>
#include <boost/optional.hpp>
#include <boost/thread.hpp>

class A

    using ios = boost::asio::io_service;

    ios                        m_io;
    boost::optional<ios::work> m_active;
  public:
    A() : m_io(), m_active(ios::work(m_io)) 

    ~A() 
        m_active.reset();
        m_io.run(); // to completion
    

    void update()
    
        m_io.poll();
        //do other stuff
    

    void postSomething()
    
        int i = 0;
        while(m_active)
        
            m_io.post([&]std::cout<<"something" << ++i << "\n";);
            boost::this_thread::sleep_for(boost::chrono::milliseconds(250));
        
    
;

int main()

    boost::thread thr;
    
        A a;

        thr = boost::thread(boost::bind(&A::postSomething, &a));

        for (int i = 0; i < 300; ++i)
        
            boost::this_thread::sleep_for(boost::chrono::milliseconds(5));
            a.update();
        
    

    thr.join(); // thread will not join unless A is destructed (m_active is cleared)

但是,您可能还想查看 Developing Boost Asio Extensions,因为这将允许您“仅 run()”并仍然交错您自己的(可能是非 IO)任务

【讨论】:

确实,通过这个例子,我明白我需要一个工人。没有工人,它就行不通。感谢 sehe 和 David Schwartz。 哇。多诗人。如此明智 :) (我猜你的意思是 work 带有 'worker' 的对象 - 后者通常用于指示后台线程)

以上是关于循环调用 boost io_service poll的主要内容,如果未能解决你的问题,请参考以下文章

Boost::Asio : io_service.run() vs poll() 或者我如何在主循环中集成 boost::asio

从线程池调用时,boost 的 io_service 是不是共享请求线程?

在 boost::asio::io_service 上调用 run 时崩溃

从多个线程调用 boost::asio::io_service 运行函数

Qt 事件处理程序和 boost ASIO 的 io_service 有啥区别?

从作为分离线程运行的 boost::asio::io_service::work 捕获异常