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