C++多生产者,多消费者模型

C++11实现多生产者,多消费者模型

在C++标准库中实现多生产者多消费者模型,可以使用std::thread、std::queue、互斥锁(std::mutex)、条件变量(std::condition_variable)等组件。下面是一个简单的示例,展示如何创建多生产者和多消费者模型,并使用线程池的概念来限制线程的数量(虽然C++标准库没有直接提供线程池,但可以手动管理线程来模拟)。

main.cpp:

using namespace std;
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>

std::queue<int> producedData;
std::mutex mtx;
std::condition_variable cv;

void producer(int id, int itemsToProduce) {
    for (int i = 0; i < itemsToProduce; ++i) {
        std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟生产时间
        std::lock_guard<std::mutex> lock(mtx);
        std::cout << "Producer " << id << " produced " << i << std::endl;
        producedData.push(i);
        cv.notify_one(); // 通知消费者有新数据
    }
}

void consumer(int id) {
    while (true) {
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, []{return !producedData.empty();}); // 等待直到队列非空
        int data = producedData.front();
        producedData.pop();
        lock.unlock();
        std::cout << "Consumer " << id << " consumed " << data << std::endl;
        if (data == 4) { // 假设每个生产者生产5个数据,消费者在消费完后退出
            break;
        }
    }
}

int main()
{
    constexpr int numProducers = 2;
    constexpr int numConsumers = 2;
    constexpr int itemsPerProducer = 5;
    // 启动生产者线程
    std::vector<std::thread> producers;
    for (int i = 0; i < numProducers; ++i) {
        producers.emplace_back(producer, i, itemsPerProducer);
    }

    // 启动消费者线程
    std::vector<std::thread> consumers;
    for (int i = 0; i < numConsumers; ++i) {
        consumers.emplace_back(consumer, i);//在第i个之后追加consumer
    }

    // 等待所有生产者线程完成
    for (auto& t : producers) {
        t.join();
    }
    // 发出结束信号给消费者(在本例中,通过生产的特定数量来隐式完成)
    // 注意:真实应用中可能需要更明确的结束信号机制

    // 等待所有消费者线程完成
    for (auto& t : consumers) {
        t.join();
    }
    return 0;
}

运行效果:
在这里插入图片描述
后续优化:
在实际应用中,可能还需要考虑更多的异常处理逻辑、线程安全、资源管理等问题,以及根据具体需求调整线程的创建和管理策略。

  • 28
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值