C++20实战之channel
继前面两节的直播,讲解了thread、jthread、stop_token、stop_source、stop_callback、cv、cv_any等的用法与底层实现,那么如何基于这些知识实现一个小项目呢?
于是引出了这篇,写一个channel出来。
注:本节的代码部分将会在星球公开,需要代码的前往末尾获取。
1.设计
1.1 接口设计
接口层面我们期望与通用的channel一样,能够一次性创建一个发送、接收的channel。
例如:
auto [sender, receiver] = make_channel<int>();
这里的实现可以通过类似make_unique提供一个对外的接口,返回值通过C++17的结构化绑定获取,此时便得到了两个channel。
最核心的两个接口:发送与接收。
发送
sender.send(counter++);
接收
auto value = receiver.recv();
除此之外,还可以在析构函数的时候提供一个shutdown接口,当send、recv阻塞的时候能够被唤醒释放。
例如: