zoukankan      html  css  js  c++  java
  • 队列-锁

    在这

    在音视频开发中,我们需要用到队列来存解码得到的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;
    
    
            }
    
    
        }
    以上就是关于队列和锁的简单介绍。
     


  • 相关阅读:
    剩下的树
    守形数
    小白鼠排队(map容器插入数据的四种方法)
    字母统计
    与7无关的数
    ZOJ
    基于js的CURD插件
    API验证插件
    Django之权限管理插件
    Django之信号和序列化
  • 原文地址:https://www.cnblogs.com/ranyang/p/14901561.html
Copyright © 2011-2022 走看看