在这
在音视频开发中,我们需要用到队列来存解码得到的avpacket,在这个过程中我们还需要用到锁来提高安全性,我们需要用到以下两个库:
#include <queue>
#include <mutex>
在这里我们需要用到模板,关于模板,我也不太清楚,但是这里的作用就是在创建对象时,我们可以只声明一个类,然后参数就是我们装入队列的类型。
例如:
template<typename T>
class MMQueue {
public:
~MMQueue() {
std::lock_guard< std::mutex> lck(mutex);
while(Size() > 0) {
T *t = queue.front();
queue.pop();
}
}
int Push(T *t) {
std::lock_guard< std::mutex> lck(mutex);
queue.push(t);
return 0;
}
int Pop (T * *t) {
//lock_guard作用:在进入该函数时,会自动上锁,函数结束,自动解锁。
std::lock_guard< std::mutex> lck(mutex);
int size = Size();
if(size > 0) {
*t = queue.front();
queue.pop();
return 0;
}
return -1;
}
int Size () {
return queue.size();
}
private:
std::queue<T*> queue;
//允许一个线程递归加锁。
std::mutex mutex;
};
在实际代码中,我们可以这样用
MMQueue<MMAVPacket> packetQueue;
packetQueue.Push(pkt);
while (packetQueue.Size() > 0) {
MMAVPacket *pkt = nullptr;
packetQueue.Pop(&pkt);
std::cout<<"Packet size (): "<<packetQueue.Size()<<std::endl;
if(pkt != nullptr) {
delete pkt;
}
}
以上就是关于队列和锁的简单介绍。