53.C++线程同步_条件变量
约 256 字小于 1 分钟
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <chrono>
std::mutex mtx; // 互斥锁
std::condition_variable cv; // 条件变量
std::queue<int> dataQueue; // 共享数据队列
bool done = false; // 生产者是否完成
// 生产者线程(生成数据)
void producer() {
for (int i = 1; i <= 5; ++i) {
std::this_thread::sleep_for(std::chrono::milliseconds(500)); // 模拟耗时生产
std::unique_lock<std::mutex> lock(mtx); // 加锁
dataQueue.push(i); // 生产数据
std::cout << "生产者:生产数据 " << i << std::endl;
lock.unlock(); // 解锁后再通知
cv.notify_one(); // 唤醒消费者
}
// 生产结束,通知消费者
std::unique_lock<std::mutex> lock(mtx);
done = true;
lock.unlock();
cv.notify_one(); // 唤醒消费者,告诉它数据已经全部生产完毕
}
// 消费者线程(消费数据)
void consumer() {
while (true) {
std::unique_lock<std::mutex> lock(mtx); // 获取锁
cv.wait(lock, [] { return !dataQueue.empty() || done; }); // 等待数据
while (!dataQueue.empty()) {
int value = dataQueue.front();
dataQueue.pop();
std::cout << "消费者:消费数据 " << value << std::endl;
}
if (done) break; // 生产者已完成,退出
}
}
int main() {
std::thread t1(producer);
std::thread t2(consumer);
t1.join();
t2.join();
return 0;
}