C++ 多线程同步之条件变量实战
条件变量的引入场景
在多线程编程中,我们经常会遇到线程需要等待某个条件满足后再执行的场景。 比如生产者线程生产数据后,消费者线程才能消费;队列不为空时,消费者才能从中取数据。 如果仅用互斥锁实现,消费者线程只能不断轮询检查条件,这会造成 CPU 资源的浪费。
单纯的轮询会导致 CPU 空转,降低程序运行效率,条件变量就是为解决这类问题而生的。
举个简单的轮询反例,消费者不断检查队列是否有数据:
#include<iostream>
#include<thread>
#include<mutex>
#include<queue>
using namespace std;
queue<int> data_queue;
mutex mtx;
// 生产者
void producer(){
for(int i =1; i <=5;++i){
lock_guard<mutex> lock(mtx);
data_queue.push(i);
cout <<"生产者生产数据:"<< i << endl;
}
}
// 消费者(轮询方式)
void consumer(){
while(true){
lock_guard<mutex> lock(mtx);
if(!data_queue.empty()){
int data = data_queue.front();
data_queue.pop();
cout <<"消费者消费数据:"<< data << endl;
(data ==) ;
}
}
}
{
;
;
t_producer.();
t_consumer.();
;
}


