阻塞队列实现
#ifndef BLOCKQUEUE_HPP
#define BLOCKQUEUE_HPP
#include <assert.h>
#include <chrono>
#include <condition_variable>
#include <deque>
#include <mutex>
//阻塞队列
template<class T>
class BlockDeque
{
public:
explicit BlockDeque(size_t MaxCapacity = 1000);
~BlockDeque();
void Close();
void clear();
bool empty();
bool full();
size_t size();
size_t capacity();
T front();
T back();
void push_back(const T& item);
void push_front(const T& item);
bool pop(T& item);
bool pop(T& item, int timeout);
void flush();
private:
std::deque<T> _deq;
size_t _capacity;
bool _isClose;
std::mutex _mtx;
std::condition_variable _consumer;
std::condition_variable _producer;
};
template<class T>
BlockDeque<T>::BlockDeque(size_t MaxCapacity)
: _capacity(MaxCapacity)
{
assert(MaxCapacity > 0);
_isClose = false;
}
template<class T>
BlockDeque<T>::~BlockDeque()
{
Close();
}
template<class T>
void
BlockDeque<T>::Close()
{
{
std::lock_guard<std::mutex> locker(_mtx);
_deq.clear();
_isClose = true;
}
_producer.notify_all();
_consumer.notify_all();
}
template<class T>
void
BlockDeque<T>::flush()
{
_consumer.notify_one();
}
template<class T>
void
BlockDeque<T>::clear()
{
std::lock_guard<std::mutex> locker(_mtx);
_deq.clear();
}
template<class T>
bool
BlockDeque<T>::empty()
{
std::lock_guard<std::mutex> locker(_mtx);
return _deq.empty();
}
template<class T>
bool
BlockDeque<T>::full()
{
std::lock_guard<std::mutex> locker(_mtx);
return _deq.size() >= _capacity;
}
template<class T>
size_t
BlockDeque<T>::size()
{
std::lock_guard<std::mutex> locker(_mtx);
return _deq.size();
}
template<class T>
size_t
BlockDeque<T>::capacity()
{
std::lock_guard<std::mutex> locker(_mtx);
return _capacity;
}
template<class T>
T
BlockDeque<T>::front()
{
std::lock_guard<std::mutex> locker(_mtx);
return _deq.front();
}
template<class T>
T
BlockDeque<T>::back()
{
std::lock_guard<std::mutex> locker(_mtx);
return _deq.back();
}
template<class T>
void
BlockDeque<T>::push_back(const T& item)
{
std::unique_lock<std::mutex> locker(_mtx);
while (_deq.size() >= _capacity) //生产满了,等待消费
{
_producer.wait(locker);
}
_deq.push_back(item);
_consumer.notify_one(); //通知一个消费者
}
template<class T>
void
BlockDeque<T>::push_front(const T& item)
{
std::unique_lock<std::mutex> locker(_mtx);
while (_deq.size() >= _capacity) {
_producer.wait(locker);
}
_deq.push_front(item);
_consumer.notify_one();
}
template<class T>
bool
BlockDeque<T>::pop(T& item)
{
std::unique_lock<std::mutex> locker(_mtx);
while (_deq.empty()) {
//线程阻塞,解锁,等待唤醒; 唤醒后不断尝试加锁,直至成功
_consumer.wait(locker);
if (_isClose) {
return false;
}
}
item = _deq.front();
_deq.pop_front();
_producer.notify_one();
return true;
}
template<class T>
bool
BlockDeque<T>::pop(T& item, int timeout)
{
std::unique_lock<std::mutex> locker(_mtx);
while (_deq.empty()) {
if (_consumer.wait_for(locker, std::chrono::seconds(timeout)) ==
std::cv_status::timeout) {
return false;
}
if (_isClose) {
return false;
}
}
item = _deq.front();
_deq.pop_front();
_producer.notify_one();
return true;
}
#endif // BLOCKQUEUE_HPP
/*vim 替换
% 当前文件(省略表示当前行)
s 替换
%s/a/b 当前文件 /a替换成/b
*/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗