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;
    
    
            }
    
    
        }
    以上就是关于队列和锁的简单介绍。
     


  • 相关阅读:
    SpringBoot处理跨域的四种方式
    centos部署nextcloud
    nginx反向代理时配置访问密码
    java对redis的基本操作
    springboot使用redis
    Linux安装redis
    centos安装php7.2环境 (亲测可用)
    linux下后台启动springboot项目
    全局加token
    web移动端浮层滚动阻止window窗体滚动JS/CSS处理
  • 原文地址:https://www.cnblogs.com/ranyang/p/14901561.html
Copyright © 2011-2022 走看看