介绍
开发中经常线程使用队列结构存储某种格式的一个数据,然后另一线程读取,也就是经典的生产消费模型,这里做下模板抽象使得格式兼容性更好,成为小轮子拿来便用提升效率。
代码
直接模板类,使用的话直接包含对应数据类型即可,如个人常用的音视频数据类型:Queue<AVPacket *> queue,Queue<AVFrame *> queue等。
#ifndef QUEUE_H
#define QUEUE_H
#include <mutex>
#include <queue>
template <typename T>
class Queue
{
public:
Queue() {}
~Queue() {}
//写入数据
void pushData(T val)
{
std::lock_guard<std::mutex> lock(mutex);
queue.push(val);
}
//读取头部后删除 返回-1则调用层可短暂ms级延迟降低cpu占用
int popData(T &val)
{
std::unique_lock<std::mutex> lock(mutex);
if(queue.empty())
return -1;
val = queue.front();
queue.pop();
return 0;
}
//读取头部不删除
int peekData(T &val)
{
std::lock_guard<std::mutex> lock(mutex);
if(queue.empty())
return -1;
val = queue.front();
return 0;
}
//获取队列大小
int getSize()
{
std::lock_guard<std::mutex> lock(mutex);
return queue.size();
}
//清空队列
void clearQueue()
{
/*数据节点格式不固定此处不能有效释放,仅作释放提示。外部调用者应重新实现此方法循环调用popData后释放,如
while (true)
{
AVPacket *packet = NULL;
int ret = queue.popData(packet);
if(ret > 0)
av_packet_free(&packet);
else
break;
}
*/
}
private:
std::mutex mutex;
std::queue<T> queue;
};
#endif // QUEUE_H