首页 > 解决方案 > ASIO io_service 在第二次 run() 调用时不处理后处理程序

问题描述

我希望能够将一组处理程序发布到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!”?

增强版:1.71.0

标签: c++boostboost-asio

解决方案


您必须调用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();

推荐阅读