Я очень на ранних стадиях обучения Asio. В настоящее время моя цель состоит в том, чтобы IO_Context управлял несколькими долгосрочными задачами, над которыми будет выполнено несколько рабочих потоков. Каждая задача имеет возможность стать устаревшей/недействительной в какой -то момент времени, поэтому я поддерживаю ASIO :: Cancellation_Signal наряду с будущим, которое используется для получения результатов, если он успешно завершил . /> Прогресс: < /h1>
API, который я пытаюсь реализовать, является чем-то вроде: < /p>
Код: Выделить всё
template struct CancellableTask {
// future/cancellation_signal are Non-CopyConstructible.
// Keep shared_ptrs to allow CopyConstructible-ness
std::shared_ptr m_task;
std::shared_ptr m_cancel;
asio::cancellation_slot cancelSlot() { return m_cancel->slot(); }
void cancel() { m_cancel->emit(asio::cancellation_type::all); }
};
namespace util {
template struct WrappedType;
template
struct WrappedType {
using type = T;
};
} // namespace util
namespace task {
template auto spawn(asio::io_context& io, Coroutine&& coroutine) {
using FutureReturn = util::WrappedType::type;
using FutureType = std::future;
CancellableTask task{
std::make_shared(), std::make_shared()
};
*task.m_task = co_spawn(
io,
std::forward(coroutine),
asio::bind_cancellation_slot(task.cancelSlot(), asio::use_future)
);
return task;
}
} // namespace task
< /code>
Использование выглядит следующим образом: < /p>
asio::awaitable sleepTask(std::chrono::seconds duration) try {
auto ex = co_await asio::this_coro::executor;
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79606106/boost-asio-issues-creating-cancellable-restartable-tasks[/url]