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;
}
运行效果:
后续优化:
在实际应用中,可能还需要考虑更多的异常处理逻辑、线程安全、资源管理等问题,以及根据具体需求调整线程的创建和管理策略。