Loading

Boost.asio中的协程队列库

简介

本文主要记录一下自己在使用Boost.asio时发现的一个协程队列库boost::asio::experimental::concurrent_channel。发现的路径也很搞笑,我当时需要一个队列库,因为使用的asio,所以想让AI帮忙使用Boost.asio基于协程写一个队列库,但是AI实现的有点差,于是继续让AI优化,结果它自己帮我找到了这个库。

从这个队列库的名字也可以看出,这个库还是在实验中,但是作为玩具项目中使用是没有问题的。

简单使用

auto queue = boost::asio::experimental::concurrent_channel<void(boost::system::error_code, int)>(executor, 5);

co_await queue.async_send(boost::system::error_code{}, value);

int value = co_await queue.async_receive(asio::use_awaitable);

boost::asio::experimental::concurrent_channel是一个模板,模板参数void(boost::system::error_code, int)void似乎是没有作用的,boost::system:error_code是必须的,int则是队列中的值。当发送时的error_code不为空的时候,接受时会抛出异常。队列也可以存储多个值,如下:

auto queue = boost::asio::experimental::concurrent_channel<void(boost::system::error_code, int, std::string)>(executor, 5);

co_await queue.async_send(boost::system::error_code{}, 1, "2");

auto [v1, v2] = co_await queue.async_receive(asio::use_awaitable);

构造函数有两个,一个是executor,不必多说;另一个是队列数量的最大值,如果超出这个值,还继续发送,则会陷入等待。

Github Gist: concurrent_channel

posted @ 2025-10-26 22:17  ink19  阅读(33)  评论(0)    收藏  举报