使用Boost Asio,我如何实现一个“事件”类来恢复C++20协程?
就像这样:
// Oversimplicated, but hopefully good enough as example
struct oneshot_event {
void raise();
async::awaitable<void> wait();
};
其中,wait()
可以被co_await
艾德,只要有东西调用raise()
,协程就会恢复。
我知道Boost Asio已经(或者曾经?我是在过时的文档中找到的)一个coro
类,它可以产生,但这对我没有帮助,因为有多个事件可以等待。我也不确定所有这些Boost.asio
和Boost.coroutine
是如何一起工作的
土溪畈
2条答案
按热度按时间6qftjkof1#
传统的答案会使用一个可等待的计时器(gera发布了一个答案)。
然而,这可能容易出错并且笨拙,特别是对于多线程(两个竞争条件(例如https://stackoverflow.com/a/22204127/85371,更具体地说是https://stackoverflow.com/a/43169596/85371)和数据竞争(例如,gera的代码不是线程安全的)。
更灵活的是实验通道支持:https://www.boost.org/doc/libs/master/doc/html/boost_asio/overview/channels.html
这将允许您为多个事件使用多个通道,或通过单个通道支持许多事件。通道存在于开箱即用的线程安全变体(
asio::concurrent_channel
)中。频道Demo
根据评论请求,以下是基于渠道的示例:
本地测试(用于可见计时):
z9ju0rcb2#
希望这是你想要的:
输出: