Boost.asio: как отменить ожидание, не вызывая прекращения?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Boost.asio: как отменить ожидание, не вызывая прекращения?

Сообщение Anonymous »

Рассмотрим следующий код:
#include
#include
#include
#include
#include
#include
#include

namespace ba = boost::asio;

ba::cancellation_signal cancel_sub;
void subscribe(ba::io_context &context)
{
ba::co_spawn(
context,
[]() -> ba::awaitable { co_return; },
ba::bind_cancellation_slot(cancel_sub.slot(), ba::detached));
cancel_sub.emit(ba::cancellation_type::all);
}

int main()
{
ba::io_context ctx;
subscribe(ctx);
ctx.run();
return 0;
}

Моя программа завершает работу с исключением, выданным внутренними компонентами реализации co_await в boost:
terminate called after throwing an instance of 'boost::wrapexcept'
what(): co_await: Operation canceled [system:125]

Как этого избежать?
Я пробовал:
  • Отключить исключения при отмене из сопрограммы:
co_await ba::this_coro::throw_if_cancelled(false);
  • Добавив этот код в начало моей сопрограммы, чтобы включить все виды отмены:
co_await ba::this_coro::reset_cancellation_state(ba::enable_total_cancellation());

Ничего не меняется, мое приложение все равно закрывается.
Точно, в коде boost: (помечая мои комментарии // !!! )

template
awaitable co_spawn_entry_point(
awaitable*, co_spawn_state s)
{
(void) co_await co_spawn_dispatch{};

(co_await awaitable_thread_has_context_switched{}) = false;
std::exception_ptr e = nullptr;
try
{
// !!! here an exception is thrown as the cancellation is observered.
co_await s.function();
}
catch (...)
{
// !!! caught here, all is fine
e = std::current_exception();
}

bool switched = (co_await awaitable_thread_has_context_switched{});
if (!switched)
(void) co_await co_spawn_post(); // !!! exception thrown again here as the cancellation state is checked again in await_transform! But now there is nothing to catch it...

(dispatch)(s.handler_work.get_executor(),
[handler = std::move(s.handler), e]() mutable
{
std::move(handler)(e);
});
}


Подробнее здесь: https://stackoverflow.com/questions/782 ... ermination
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»