Удалить работу из io_context или используя несколько объектов io_context - PullRequest
0 голосов
/ 20 мая 2018

В настоящее время я пытаюсь сделать возможным удаление работы, поставленной в очередь через post или dispatch до 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 s, которые отправляются пулом потоков таким образом, чтобы один io_context представляет группу, которую можно удалить с помощью io_context::stop().Все io_context будут храниться в одном списке, который затем объединяется для выдающихся событий.

Однако я считаю, что объединение или ожидание многих io_context может привести к проблемам с производительностью.Есть ли другое решение?

1 Ответ

0 голосов
/ 29 мая 2018

Нет, механизм удаления опубликованных заданий из 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;
...