单生产者 多消费者模型

问题出处:https://blog.csdn.net/u010236550/article/details/12372319 
 

生产者消费者问题:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,所有生产者和消费者都是异步方式运行的,但它们必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经装满产品且尚未被取走的缓冲区中投放产品。

        分析:假设1个生产者,2个消费者,缓冲区大小为4。

第一.从缓冲区取出产品和向缓冲区投放产品必须是互斥进行的。可以用关键段和互斥量来完成。

第二.生产者要等待缓冲区为空,这样才可以投放产品,消费者要等待缓冲区不为空,这样才可以取出产品进行消费。并且由于有二个等待过程,所以要用二个事件或信号量来控制。
 

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <chrono>
#include <stdlib.h>


char signal = 'A';
std::mutex mutex_t;
std::condition_variable cond_pro;//生产者
std::condition_variable cond_cons;//消费者
std::queue<int> que;

const int size = 4;//缓冲区大小4

int temp = 1;
void producer() 
{
	while (true)
	{
		std::unique_lock<std::mutex> lk(mutex_t);
		while (que.size()==size)
		{
			cond_pro.wait(lk);
		}
		std::this_thread::sleep_for(std::chrono::milliseconds(1000));
		printf("produce %d\n", temp);
		que.push(temp++);
		
		cond_cons.notify_all();
	}
}
void consumer(int i) 
{
	while (true)
	{
		std::unique_lock<std::mutex> lk(mutex_t);
		while (que.empty())
		{
			cond_cons.wait(lk);
		}
		printf("consumer%d consume %d\n",i,que.front());
		que.pop();
		cond_pro.notify_one();
		std::this_thread::sleep_for(std::chrono::milliseconds(500*i));
	}
}
int main() 
{
	//std::this_thread::sleep_for(std::chrono::milliseconds(1000));
	std::thread t3(consumer, 2);
	std::thread t1(producer);
	std::thread t2(consumer,1);
	
	t1.join();
	t2.join();
	t3.join();
	return 0;
}
produce 1
produce 2
produce 3
consumer1 consume 1
consumer1 consume 2
consumer1 consume 3
produce 4
consumer2 consume 4
produce 5
consumer2 consume 5
produce 6
produce 7
produce 8
produce 9
consumer2 consume 6
consumer2 consume 7
produce 10
consumer1 consume 8
consumer1 consume 9
produce 11
consumer2 consume 10
consumer1 consume 11
produce 12
consumer1 consume 12
produce 13
consumer1 consume 13
produce 14
consumer1 consume 14
produce 15
consumer1 consume 15
produce 16
consumer2 consume 16

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值