多进程-生产者消费者C++实现

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

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

cpp 复制代码
#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()**后:

相关推荐
傻啦嘿哟2 小时前
某招聘平台爬虫:爬取招聘岗位数据,分析各城市薪资水平
开发语言·爬虫·python
2501_933670792 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
yxlalm2 小时前
Spring AI+RAG 01-项目背景与技术选型
java·人工智能·spring
程序员清风3 小时前
Java 后端高并发设计:线程池、限流、熔断与降级
java·数据库·oracle
李少兄3 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript
Seoyoneh3 小时前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
海南java第二人3 小时前
对外 API 如何保证幂等性?插入数据 / 上传表格场景全方案汇总
java·幂等性
tryxr4 小时前
Chat2Excel 文件服务模块上传文件功能开发
java·项目·oss·easyexcel·文件服务
Tangyuewei4 小时前
Java 写 Agent:模型只是组件
java·开发语言
小玮看世界4 小时前
[Python]从合并区间到传感器融合区:合并区间在传感器区域融合的实际落地
开发语言·python