0
点赞
收藏
分享

微信扫一扫

【Linux:生产消费模型】

小时候是个乖乖 2024-11-01 阅读 12

目录

条件变量的相关接口:

条件变量理解:

生产消费模型:

理解生产者消费者模型特点:

消费者&&生产者接口:

生产者:​编辑

消费者: 

伪唤醒:

生产消费模型内部封装:


条件变量的相关接口:

条件变量理解:

生产消费模型:


理解生产者消费者模型特点:

消费者&&生产者接口:

生产者:

消费者: 

伪唤醒:

生产消费模型内部封装:

const static int defaultcap=3;

template <typename T>
class Blockqueue
{
    private:
    bool Isfull()
    {
        return _block_queue.size()==_max_cap;
     }
    bool IsEmpty()
    {
        return _block_queue.empty();
    }

    public:
    Blockqueue(int cap=defaultcap):_max_cap(cap)
    {
        pthread_mutex_init(&_mutex,nullptr);
        pthread_cond_init(&_p_cond,nullptr);
        pthread_cond_init(&_c_cond,nullptr);

    }
    void Pop(T *out)
    {
        pthread_mutex_lock(&_mutex);
        while(IsEmpty())
        {
            pthread_cond_wait(&_c_cond,&_mutex);

        }
        *out=_block_queue.front();
        _block_queue.pop();
        pthread_mutex_unlock(&_mutex);
        pthread_cond_signal(&_p_cond);//唤醒生产者生产


    }

    void enqueue(const T&in)
    {
        pthread_mutex_lock(&_mutex);
        //判断队列是否满
        while(Isfull())
        {
            //加锁后,线程判断队列是否已满
            //队列满了,线程就会阻塞的等待
            //等待的同时,该线程会释放锁
            //当该函数返回之前,线程首先需要参与锁的竞争,重新加上锁
            pthread_cond_wait(&_p_cond,&_mutex);
        }
        //没有满||队列为空,生产者生产
        _block_queue.push(in);
        pthread_mutex_unlock(&_mutex);
        //对于线程的唤醒位置是否需要在释放锁的前后原因:
        //1.放在释放锁的前面: 生产者唤醒消费者线程,消费者线程被唤醒
        //                    生产者释放锁,消费者竞争锁,拿取到锁,开始消费
        //2.放在释放锁的后面: 生产者释放锁后同时又开始参与锁的竞争
        //                    唤醒消费线程,消费者线程参与锁的竞争
        //                    由于队列已满,生产者线程等待同时释放锁,消费者线程拿取到锁
        pthread_cond_signal(&_c_cond);//唤醒消费者消费
    }
    ~Blockqueue()
    {
        pthread_mutex_destroy(&_mutex);
        pthread_cond_destroy(&_p_cond);
        pthread_cond_destroy(&_c_cond);

    }
    private:
    std::queue<T> _block_queue;
    int _max_cap;
    pthread_mutex_t _mutex;
    //生产者
    pthread_cond_t _p_cond;
    //消费者
    pthread_cond_t _c_cond;

};
举报

相关推荐

0 条评论