跳至主要內容

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;
}