仍然接着我的上一篇博客里的内容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