从io_context中删除工作或使用多个io_context对象

时间:2018-05-20 03:17:04

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

目前,我尝试将通过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_context,以便一个io_context表示可以通过io_context::stop()删除的组。所有io_context都将保存在一个列表中,然后将其汇总以用于未完成的事件。

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

1 个答案:

答案 0 :(得分: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;