【C++笔记】之基于C++11 condition_variable实现的缓存限制队列

由于需要控制队列的长度, 所以没有使用二级缓存, 也就是说, 没有在消费线程使用std::vector之类的进行二级缓存, 使用二级缓存需要考虑均匀分布的问题. 当然, 就算使用二级缓存, 也可以控制待处理的数据的长度, 但是处理会变得很复杂. 这里只是提供一个简单的用法, 需要其他效果的, 可以参考构建.

cpp 复制代码
#include <condition_variable>
#include <chrono>
#include <queue>
#include <mutex>

/*
 * 有最大队列个数限制
 */

// 参数T需要能够拷贝,而且拷贝不会存在副作用
template <typename T>
class sync_queue {
public:
    sync_queue(int queueMaxSize): m_queueMaxSize(queueMaxSize) { }

    // 处理数据线程
    template <typename Func>
    typename std::result_of<Func(T)>::type readQueue(Func readFunc) {
        T data;
        // 取出数据, 然后处理数据
        {
            std::unique_lock<std::mutex> lock(m_queueMtx);
            m_consumeCv.wait(lock, [this]{ return m_data.size() != 0; });

            data = m_data.front();
            m_data.pop();
        }
        m_produceCv.notify_one();

        return readFunc(data);
    }

    // 生产数据线程, 返回值表示是否生产成功,如果超时就不会生产成功
    template <typename Rep, typename Period>
    bool writeQueue(T data, const std::chrono::duration<Rep, Period>& wait_time) {
        // 预设一个消费者处理这个数据
        {
            std::unique_lock<std::mutex> lock(m_queueMtx);
            auto success = m_produceCv.wait_for(lock, wait_time, [this]{ return m_data.size() <= m_queueMaxSize; });
            if (!success) {
                return false;
            }
            m_data.push(std::move(data));
        }
        m_consumeCv.notify_one();
        return true;
    }

private:
    // 用来存储生产者存储的值
    std::queue<T> m_data;
    // 用来表示待处理的数据
    int m_queueMaxSize;
    // 用来队列保护
    std::mutex m_queueMtx;
    // 用来提醒当前可以消费
    std::condition_variable m_consumeCv;
    // 用来提醒当前可以生产
    std::condition_variable m_produceCv;
};
相关推荐
神仙别闹4 小时前
基于 C++ 实现(控制台)学生成绩管理系统
开发语言·c++
会周易的程序员4 小时前
5 节点边缘冗余方案(上):基于 aiRaft 的物联网高可用控制面设计
c++·分布式·物联网·raft·iot·共识
智者知已应修善业6 小时前
【4060BD_5V应用电路图】2022-12-24
驱动开发·经验分享·笔记·硬件架构·硬件工程
qq_199886877 小时前
第6板块·第4节:构建系统与多文件项目
c++·人工智能·gpu算力
汉克老师9 小时前
GESP2026年9月认证C++三级( 第三部分编程题(2、分割字符串))精讲
c++·gesp·小学生·学c++编程
估值探索者9 小时前
【Python量化系统工程化 #08】关了 SSH 就停?systemd 让脚本开机自启 + 异常自动拉起
java·c++·人工智能·分类·数据挖掘
小李不想当小白9 小时前
DMA直接存储器存取(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·分享
天若有情6739 小时前
C++花式魔改!手写头文件复刻Java语法,彻底打破编码思维定式
java·c++·语言做语言·jac++
qq_1998868710 小时前
第7板块·第3节:CUTLASS 的 GEMM 实现与优化策略
c++·人工智能·gpu算力·cuda
hetao173383710 小时前
2026-09-17 hetao1733837 的刷题记录
c++·算法