生产者-消费者问题&&读者-写者问题 伪代码

生产者-消费者问题&&读者-写者问题

生产者 - 消费者问题


定义

Program producer_consumer

const sizeofbuffer = ... //缓冲量大小
var s: semaphore(:=1);//互斥信号量 申请/释放 资源使用权
var n: semaphore(:=0);//资源信号量 (数据资源) 申请/归还 资源
var e: semaphore(:sizeofbuffer);//资源信号量 空存储单元
 

生产者

procedure producer;
	begin
		repeat
		生产一条数据;
		wait(e);
		wait(s);
		存入一条数据;
		signal(s);
		signal(n);
	forever
		end;
		

消费者

procedure consumer;
	begin
		repeat
		wait(n);
		wait(s);
		取一条数据;
		signal(s);
		signal(e);
		消费数据;
	forever
		end;
		

主程序

	begin
		parbegin
		producer;consumer;
		parend
	end;
	

读者 - 写者问题(读者优先)


定义

Program readers_writers;

const readcount:integer;//统计读者个数
var x,wsem:semaphore(:=1)//互斥信号量

读者

procedure reader;
	begin
		repeat
		wait(x);//实现统计数量互斥,读者要一个一个去登记
		readcount:= readcount+1;
		if readcount = 1 then wait(wsem);//有读者了,就不让写者进来了
		signal(x);
		读数据;
		wait(x);
		readcount:= readcount - 1;
		if readcount = 0 then signal(wsem);//读者出去完毕,通知写者进来
		signal(x);
	forever
		end;
		

写者

procedure writer;
	begin	
		repeat
		wait(wsem);
		写数据;
		signal(wsem);
	forever
		end;
		

主程序

begin
	readcount:= 0;
	parbegin
	reader;writer;
	parend
end;
	
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值