生产者和消费者问题变形

题目:

进程A1、A2、…n1.通过m个缓冲区向进程B1、B…n.不断地发送
消息。发送和接收工作遵循如下规则:
(1) 每个发送进程一次发送一个消息,写入一个缓冲区,缓冲区大小等于
消息长度;
(2)对每一个消息,B1,B2,…,. Bn都必须接收一次,读入各自的数据区内。
m个缓冲区都满时,发送进程等待;没有可读的消息时,接收进程等待。


semaphore mutex=1; //用于所有进程互斥访问缓存区buffer,以及in,out变量 
semaphore empty = m, full = 0;

int in = 0, out = 0;
buffer[m];

semaphore mutex2 = 0;  //用于互斥访问rcount,flag; 
int rcount = 0;    //用于记录当前in所指的消息有多少个B类进程已接收 
int flag[n2] = {0,0,0,0,....,0}; //flag[i]==1表示Bi已经取过buffer[in]中的消息了 
 
void A(int i) //进程Ai 下标从0开始 
{
	while(true)
	{
		准备要发送的消息;
		wait(empty);
		wait(mutex);
		buffer[in] = 要发送的消息;
		in = (in+1)%m;
		signal(mutex);
		signal(full); 
	}
} 
void B(int i) //Bi下标从0开始 
{
	while(true)
	{
		wait(mutex2); 
		if(flag[i] == 0)
		{
			wait(full);
			wait(mutex);
			将buffer[out]所存的消息取出;
			flag[i] = 1;
			rcount++;
			if(rcount == n2)
			{//Bi是B类进程最后一个读该消息的进程 
				out = (out+1)%m;
				signal(empty); 
				//将flag、rcount重置 
				for(int j = 0; j < n2; j++)  flag[j] = 0;
				rcount = 0;
			}
			else
			{//不是应signal(full)一次补偿被自己消耗的full 
				signal(full);
			}
			signal(mutex);
		}
		signal(mutex2); 
	}
} 
int main()
{
	cobegin:
		for(int i = 0; i < n1; i++) A(i);
		for(int j = 0; j < n2; j++) B(j);
	coend;
	return 0;
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值