3、多生产者单消费者模式:
- 与单生产者和单消费者模型不同的是,多生产者-单消费者模型中可以允许多个生产者同时向产品库中放入产品。所以除了保护产品库在多个读写线程下互斥之外,还需要维护生产者放入产品的计数器
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <deque>
using namespace std ;
static const int kItemsToProduce = 20 ;
std ::mutex stdoutMutex;
struct ItemRepository
{
deque <int > itemQueue;
int MaxSize = 10 ;
int itemCounter=0 ;
std ::mutex mtx;
std ::mutex itemCounterMtx;
std ::condition_variable repository_notFull;
std ::condition_variable repository_notEmpty;
}gItemRepository;
typedef struct ItemRepository ItemRepository;
void ProduceItem(ItemRepository &itemRepo, int item)
{
std ::unique_lock<std ::mutex> lock(itemRepo.mtx);
itemRepo.repository_notFull.wait(lock, [&itemRepo] {
bool full = itemRepo.itemQueue.size() >= itemRepo.MaxSize;
if (full)
{
std ::lock_guard<std ::mutex> lock(stdoutMutex);
cout << "仓库满了,生产者等待中..." << "thread id = " << std ::this_thread::get_id() << endl;
}
return !full;
});
itemRepo.itemQueue.push_back(item);
itemRepo.r