多进程-生产者消费者C++实现
2026/4/18 10:50:42 网站建设 项目流程

条件变量通常与互斥锁配合使用,用于线程之间的通信和同步。它允许线程在某个条件满足之前等待,当条件满足时,其他线程可以通知等待的线程继续执行

例如,在生产者 - 消费者模型中,生产者线程生产数据后,通过条件变量通知消费者线程有新的数据可用;消费者线程在没有数据时,通过条件变量等待,避免无效的轮询。

#include <iostream> #include <thread> #include <mutex> #include <condition_variable> #include <queue> std::mutex mtx; std::condition_variable cv; std::queue<int> data_queue; // 共享数据队列 // 生产者线程函数 void producer() { for (int i = 0; i < 10; ++i) { std::unique_lock<std::mutex> lock(mtx); data_queue.push(i); // 生产数据 std::cout << "Generate: " << data_queue.back() << std::endl; lock.unlock(); cv.notify_one(); // 通知一个等待的消费者线程 std::this_thread::sleep_for(std::chrono::milliseconds(100)); } } // 消费者线程函数 void consumer() { while (true) { std::unique_lock<std::mutex> lock(mtx); cv.wait(lock, [] { return!data_queue.empty(); }); // 等待数据到来 int data = data_queue.front(); // 消费数据 data_queue.pop(); lock.unlock(); std::cout << "Consumed: " << data << std::endl; if (data == 9) break; // 消费完所有数据后退出 } } int main() { std::thread t1(producer); std::thread t2(consumer); t1.join(); t2.join(); return 0; }
  • 生产者线程(producer):循环生成 0 到 9 共 10 个整数,每生成一个就放入共享队列,并通知消费者。

  • 消费者线程(consumer):不断等待队列非空,取出数据并消费(打印),当消费到数字 9 时退出循环。

  • 互斥锁std::mutex mtx

    保护共享资源data_queue,确保同一时刻只有一个线程能修改或读取队列。

  • 条件变量std::condition_variable cv

    实现线程间的等待/通知机制:

  • 消费者在队列为空时调用cv.wait()进入阻塞状态,释放锁。

  • 生产者每次放入数据后调用cv.notify_one()唤醒一个等待的消费者线程,如果注释掉,消费者会进入无限等待状态。

  • 注释cv.notify_one()后:

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询