【问题标题】:Remove work from a io_context or using multiple io_context objects从 io_context 或使用多个 io_context 对象中删除工作
【发布时间】:2018-05-20 03:17:04
【问题描述】:

目前,我正在尝试将通过postdispatch 排队的工作删除到io_context。工作由少量排队者组排队,工作应一次性全部移除:

boost::asio::io_context context;

auto work = [] {
  // ...
};
boost::asio::post(context, std::move(work));

// ... now I want to remove the work

asio库有没有提供这样的功能?

目前我正在处理的应用程序正在使用一个线程池,该线程池从多个线程调用io_context::run()

我的想法是我可以创建多个由线程池调度的io_contexts,这样一个io_context 代表一个可以通过io_context::stop() 删除的组。所有io_contexts 都将保存在一个列表中,然后汇集起来用于未完成的事件。

但是,我认为汇集或等待许多 io_contexts 可能会导致性能问题。 有不同的解决方案吗?

【问题讨论】:

  • 您检查过${boost_root}/libs/asio/example/cpp11/executors/pipeline.cpp 吗?我认为您不需要超过一个io_context

标签: c++ asynchronous boost boost-asio event-loop


【解决方案1】:

不,没有从io_context 中删除已发布职位的机制。或者,您可以修改您的作业以在它们运行之前检查是否设置了“取消标志”(未经测试):

// create a cancellation flag
const auto cancel = std::make_shared<std::atomic<bool> >();

auto work = [=] {

    // check to see if the flag has been set
    // if so, return without performing our task
    if(*cancel)
        return;

    // perform some task
};

// post our job
boost::asio::post(context, std::move(work));

...

// cancel all jobs checking this flag
*cancel = true;

【讨论】:

  • 遗憾的是,在这里设置取消标志是不够的,因为该工作将包含对放置在共享库中的代码的引用,该共享库在工作被删除/取消后被卸载,这将导致访问违规。因此,确实需要从问题所述的 io_context 中删除工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 2020-06-09
相关资源
最近更新 更多