C++ 多线程同步之条件变量(condition_variable)实战
49.1 条件变量的引入场景
在多线程编程中,我们经常会遇到线程需要等待某个条件满足后再执行的场景。比如生产者线程生产数据后,消费者线程才能消费;队列不为空时,消费者才能从中取数据。如果仅用互斥锁实现,消费者线程只能不断轮询检查条件,这会造成 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.();
;
}


