【问题标题】:ASIO io_service do not process post handlers on second run() callASIO io_service 在第二次 run() 调用时不处理后处理程序
【发布时间】:2019-12-30 19:05:52
【问题描述】:

我希望能够将一组处理程序发布到boost::asio::io_service,然后运行所有处理程序。当所有处理程序完成后,我想再次添加一组新的处理程序和run()。并在一个线程中永远重复此操作。

但是我有一个问题,在第一次run() 调用之后,下一个发布的职位被忽略了。

这是一个小例子(coliru):

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

int main()
{
    boost::asio::io_service io;

    io.post([]{ std::cout << "Hello";});
    io.run();
    io.post([]{ std::cout << ", World!" << std::endl; });
    io.run();
}

它只会打印“Hello”消息然后成功退出。

为什么这个例子不打印“Hello, World!”?

Boost 版本:1.71.0

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

    您必须致电restart:

    run() 函数的正常退出意味着 io_context 对象已停止(stopped() 函数返回 true)。随后的 对 run()、run_one()、poll() 或 poll_one() 的调用将返回 除非事先调用了 restart(),否则立即立即执行。

    io.post([]{ std::cout << "Hello";});
    io.run();
    io.post([]{ std::cout << ", World!" << std::endl; });
    io.restart(); // just here
    io.run();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多