C++ 多线程同步实战:条件变量(condition_variable)
💡 学习目标:掌握 C++ 标准库中条件变量的使用方法,理解条件变量与互斥锁的协同工作机制,能够解决多线程间的等待 - 通知问题。
💡 学习重点:std::condition_variable 的核心接口、wait() 与 notify_one()/notify_all() 的配合使用、生产者 - 消费者模型的实现。
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);
(!data_queue.()){
data = data_queue.();
data_queue.();
cout << << data << endl;
(data == ) ;
}
}
}
{
;
;
t_producer.();
t_consumer.();
;
}


