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;
}
運行效果:
后續優化:
在實際應用中,可能還需要考慮更多的異常處理邏輯、線程安全、資源管理等問題,以及根據具體需求調整線程的創建和管理策略。