队列-锁

在这

在音视频开发中,我们需要用到队列来存解码得到的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;

        }

    }
以上就是关于队列和锁的简单介绍。
 


posted @ 2021-06-18 23:03  jianzhui  阅读(138)  评论(0编辑  收藏  举报