C++ Thread学习四 (使用条件变量condition_variable来实现生产者消费者)

本文介绍了如何使用C++的条件变量condition_variable解决生产者消费者问题,避免了读线程在队列为空时仍获取锁导致写线程阻塞的问题。条件变量在满足特定条件时唤醒线程,配合互斥量mutex使用,通过wait()函数和notify_one()或notify_all()函数协调生产者和消费者的同步操作。
摘要由CSDN通过智能技术生成

仍然接着我的上一篇博客里的内容https://blog.csdn.net/mcc12356/article/details/106825972(感兴趣可以去看看),主要是一个写线程往共享队列里写数据,另一个读线程从队列里读数据。当时使用了mutex来实现了对共享队列的保护,但是那里会有一点问题,如果共享队列为空,读队列线程读取不到数据,但仍然可能获取了锁导致写线程被阻塞。那么能否有一种方法使得读线程只有在队列不为空时才能获取锁呢?这时条件变量(condition_variable)就派上了用场。

条件变量介绍:

顾名思义,条件变量是一个类,他起到的作用阻塞某一个线程,当满足某一个条件时该线程被唤醒继续执行,要配合互斥量mutex使用。

新建一个条件变量:

condition_variable my_condV;

wait()函数

unique_lock<mutex> mutexObj(my_mutex);

my_condV.wait(mutexObj, [this] {
            if (!msgQueue.empty()) return true;
            return false;
        });                       

首先需要一个unique_lock对象,wait函数第一个参数是此unique_lock对象,第二个参数是一个函数(这里写了一个lambda function),含义是如果队列不为空,就可以继续执行后面的语句。如果队列为空&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值