前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >环形buffer单生产单消费队列

环形buffer单生产单消费队列

作者头像
叶茂林
发布2024-06-13 10:43:18
470
发布2024-06-13 10:43:18
举报

环形缓冲区由一个固定大小的数组构成,生产者将数据写入缓冲区的尾部,而消费者则从缓冲区的头部读取数据,当缓冲区被填满时,生产者会等待,直到有空间可用;当缓冲区为空时,消费者会等待,直到有数据可用

使用两个循环指针用来实现环形队列,头指针和尾指针在队列为空的时候是相同的,起始为0,当头指针快追上尾指针的时候代表队列已满,也就是head=tail-1的时候,这意味着我们使用了一个元素的位置来表示队列是否满,环形buffer实际容量为数组长度减去一个单位

生产即入队,元素安排在头指针处,之后头指针移动,消费即出队,取尾指针处元素后移动尾指针

代码语言:javascript
复制
template<typename T, std::size_t N>
class RingBuffQueue {
public:
    constexpr RingBuffQueue(): head(0), tail(0) {
    }

    // 如果满了返回false, 成功返回true
    bool enqueue(T val) {
        const int nextTail = (tail + 1) % N;
        if (nextTail == head) {
            std::cout<<"full: "<<val<<std::endl;
            return false;
        }
        buff[tail] = val;
        tail = nextTail;
        std::cout << "product: " << val << std::endl;
        return true;
    }

    // 如果空返回nullopt, 成功返回队首元素
    std::optional<T> dequeue() {
        if (head == tail) {
            std::cout << "empty" << std::endl;
            return std::nullopt;
        }
        T response = buff[head];
        head = (head + 1) % N;
        std::cout<<"consume: "<<response<<std::endl;
        return response;
    }

private:
    std::array<T, N> buff;
    size_t head;
    size_t tail;
};

考虑并发生产和消费还需要加锁

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档