tongqingliu

保持学习的态度

C++实现安全队列

```cpp

#ifndef SAFEQUEUE
#define SAFEQUEUE

#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>

using namespace std;

template<typename T>
class SafeQueue {
public:
    SafeQueue() {}

    ~SafeQueue() {}

    void InitQueue()
    {
        work = 1;
    }


    void EnQueue(T value) 
    {
        lock_guard<mutex> lock(mt);
        if (work) {
            q.push(value);
            cv.notify_one();
        }
    }

    void Print()
    {
        lock_guard<mutex> lock(mt);
        queue<T> copy_queue = q;

        while (!q.empty())
        {
            copy_queue.push(q.front());
            q.pop();
        }
        while (!copy_queue.empty())
        {
            std::cout << copy_queue.front() << std::endl;
            copy_queue.pop();
        }
    }

    int DeQueue(T& value) 
    {
        int ret = 0;
        //占用空间相对lock_guard 更大一点且相对更慢一点,但是配合条件必须使用它,更灵活
        unique_lock<mutex> lock(mt);
        //第二个参数 lambda表达式:false则不阻塞 往下走
        cv.wait(lock, [this] {return !work || !q.empty(); });
        if (!q.empty()) {
            value = q.front();
            q.pop();
            ret = 1;
        }

        return ret;
    }

    void setWork(int work) 
    {
        lock_guard<mutex> lock(mt);
        this->work = work;
    }

    void Clear() 
    {
        lock_guard<mutex> lock(mt);
        while (!q.empty())
        {
            q.pop();
        }
    }

    int Find(T value)
    {
        return nullptr;
    }

private:
    mutex mt;
    condition_variable cv;

    queue<T> q;
    //是否工作的标记 1 :工作 0:不接受数据 不工作
    int work;
};

#endif //SAFEQUEUE

posted on   tongqingliu  阅读(229)  评论(0编辑  收藏  举报

编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构

导航

统计信息

点击右上角即可分享
微信分享提示