【问题标题】:How to check if boost::asio::io_service has started running?如何检查 boost::asio::io_service 是否已开始运行?
【发布时间】:2021-07-21 18:53:31
【问题描述】:

在主线程中,我在一个循环中创建了 8 个std::threads。 所有这些线程最终都会调用_ios.run() // _ios is per thread

在类定义中:

boost::asio::io_service                           _ios;
boost::optional<boost::asio::io_service::work>    _work;
std::thread                                       _thread;

类构造函数:

{
      _work = boost::in_place(boost::ref(_ios));
      _thread = std::thread{[this] () {
              setup_a_few_stuffs();
              _ios.run();
          }
      };
}

在主线程中,我想向这些io_services 发布作业,但我想确保所有线程都已开始运行它们的io_services,即所有线程都已调用_ios.run() 并准备就绪处理作业。

有没有办法查询io_serivce 的状态? 如果是,那么我可以一一查询所有线程的io_services 是否准备好。

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

    您可以使用stopped member function。根据Boost Asio Documentation

    此函数用于确定io_context 对象是否已停止,无论是通过显式调用stop(),还是由于工作不足。当 io_context 对象停止时,对 run()run_one()poll()poll_one() 的调用将立即返回,而无需调用任何处理程序。

    使用!_ios.stopped(),您将知道_ios 是否仍在运行。

    【讨论】:

    • 如果线程尚未调用 _ios.run(),!_ios.stopped() 将评估为 true
    • @void 是的,它会的。现在我意识到我误解了你的问题。我以为您想等待_ios 完成工作以发布新工作,但现在我看到您想等待_ios.run() 被调用然后才发布工作。我发现这种方法存在问题,就好像您在发布任何作品之前致电run,电话将立即返回。此外,您不必在发布工作之前等待run - 您可以先发布它,然后只要调用run,就会执行工作。
    • 是的,这不是我在问题中所问的。你的回答与我问的相反。 :) 我发现这种方法有一个问题,好像你在发布任何工作之前调用 run ,调用将立即返回。 不正确。 _work = boost::in_place(boost::ref(_ios)); 负责处理。
    猜你喜欢
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多