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
作者:
tongqingliu
出处: http://www.cnblogs.com/liutongqing/
本文版权归作者和博客园共有,欢迎转载、交流,但未经作者同意必须保留此段声明,且在文章明显位置给出原文链接。
如果觉得本文对您有益,欢迎点赞、欢迎打赏。
出处: http://www.cnblogs.com/liutongqing/
本文版权归作者和博客园共有,欢迎转载、交流,但未经作者同意必须保留此段声明,且在文章明显位置给出原文链接。
如果觉得本文对您有益,欢迎点赞、欢迎打赏。


posted on 2020-09-01 18:00 tongqingliu 阅读(229) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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语句:使用策略模式优化代码结构