1. 代码
#ifndef __BLK_QUEUE_H__
#define __BLK_QUEUE_H__
#include <condition_variable>
#include <mutex>
#include <deque>
#include <chrono>
namespace DailyRecord
{
template <typename _Task>
class BlockingQueue
{
public:
BlockingQueue(size_t cap = 128) : cap_(cap) {}
virtual ~BlockingQueue() {}
void Enqueue(const _Task &task)
{
std::unique_lock<std::mutex> lock(mutex_);
while (task_.size() >= cap_)
{
cv_full_.wait(lock);
}
task_.push_back(task);
cv_empty_.notify_all();
}
bool TryEnqueue(const _Task &task, uint32_t wait)
{
std::unique_lock<std::mutex> lock(mutex_);
if (task_.size() >= cap_)
{
cv_full_.wait_for(lock, std::chrono::milliseconds(wait));
}
if (task_.size() >= cap_)
{
return false;
}
task_.push_back(task);
cv_empty_.notify_all();
}
_Task Dequeue()
{
std::unique_lock<std::mutex> lock(mutex_);
while (task_.empty())
{
cv_empty_.wait(lock);
}
_Task task = task_.front();
task_.pop_front();
cv_full_.notify_all();
return task;
}
bool TryDequeue(_Task *task, uint32_t wait)
{
std::unique_lock<std::mutex> lock(mutex_);
if (task_.empty())
{
cv_full_.wait_for(lock, std::chrono::milliseconds(wait));
}
if (task_.empty())
{
return false;
}
*task = task_.front();
task_.pop_front();
cv_full_.notify_all();
return true;
}
size_t Size()
{
std::unique_lock<std::mutex> lock(mutex_);
return task_.size();
}
bool Empty()
{
std::unique_lock<std::mutex> lock(mutex_);
return task_.size() == 0;
}
bool Full(uint32_t wait = 1)
{
std::unique_lock<std::mutex> lock(mutex_);
if (task_.size() < cap_)
{
return false;
}
cv_full_.wait_for(lock, std::chrono::milliseconds(wait));
return task_.size() >= cap_;
}
void Clear(void (*deleteFunc)(_Task) = nullptr)
{
std::unique_lock<std::mutex> lock(mutex_);
if (deleteFunc != nullptr)
{
while (!task_.empty())
{
_Task task = task_.front();
deleteFunc(task);
task_.pop_front();
}
}
else
{
task_.clear();
}
}
private:
size_t cap_;
std::mutex mutex_;
std::condition_variable cv_full_;
std::condition_variable cv_empty_;
std::deque<_Task> task_;
};
}
#endif
github地址
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)