前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++20实战之channel

C++20实战之channel

作者头像
公众号guangcity
发布2024-06-05 15:08:45
1040
发布2024-06-05 15:08:45
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)

C++20实战之channel

继前面两节的直播,讲解了thread、jthread、stop_token、stop_source、stop_callback、cv、cv_any等的用法与底层实现,那么如何基于这些知识实现一个小项目呢?

于是引出了这篇,写一个channel出来。

注:本节的代码部分将会在星球公开,需要代码的前往末尾获取。

1.设计

1.1 接口设计

接口层面我们期望与通用的channel一样,能够一次性创建一个发送、接收的channel。

例如:

代码语言:javascript
复制
auto [sender, receiver] = make_channel<int>();

这里的实现可以通过类似make_unique提供一个对外的接口,返回值通过C++17的结构化绑定获取,此时便得到了两个channel。

最核心的两个接口:发送与接收。

  • 发送
代码语言:javascript
复制
 sender.send(counter++);
  • 接收
代码语言:javascript
复制
auto value = receiver.recv();

除此之外,还可以在析构函数的时候提供一个shutdown接口,当send、recv阻塞的时候能够被唤醒释放。

例如:

代码语言:javascript
复制
bool shutdown() {
    if (!state_) {
        return false;
    }

    light_city_lock lk(state_->mutex);
    if (source_.stop_requested()) {
        return false;
    }
    source_.request_stop();
    state_->cv.notify_all();
    return true;
}

1.2 内部队列设计

内部队列可以参考前面几天发的如何设计一个线程安全的多生产者多消费者队列如何实现一个线程安全多生产多消费者队列?,这里可以内部维护一个state,然后带上queue、mutex、cv_any。

代码语言:javascript
复制
struct State {
    std::queue<T> queue;
    std::mutex mutex;
    // C++11 condition_variable_any
    std::condition_variable_any cv;
};

2.使用

使用起来就非常容易,只需要make出来两个channel,然后去send与recv即可。

这里我使用了jthread + stop_token来完成这个工作,例如:

代码语言:javascript
复制
std::jthread sender_thread(
    [](Channel<int> sender, std::stop_token token) {
      int counter = 0;
      while (!token.stop_requested()) {
        sender.send(counter++);
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
      }
    },
    std::move(sender), token);

接收端线程类似,在执行的差不多时,我们可以使用

代码语言:javascript
复制
stop_source.request_stop();

至此,便模拟了一个channel,发送端发送数据,接收端接收数据即可。

运行示例:

代码语言:javascript
复制
➜  channel ./a.out                  
Received: 0
Received: 1
Received: 2
Received: 3
Received: 4
Received: 5
Received: 6
Received: 7
Received: 8
Received: 9
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++20实战之channel
  • 1.设计
    • 1.1 接口设计
      • 1.2 内部队列设计
      • 2.使用
      相关产品与服务
      云直播
      云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档