记录型信号量解决生产者消费者问题伪代码,描述每一步具体执行过程

Varmutex,empty,full:semaphore:=1,n,0;buffer:array[0,...,n-1]ofitem;in,out:integer:=0,... Var mutex,empty,full:semaphore:=1,n,0;
buffer:array[0,...,n-1]of item;
in,out:integer:=0,0;
begin
parbegin
proceducer:begin
repeat
.
.
.
producer an item nextp;
.
.
.
wait(empty);
wait(mutex);
buffer(in):=nextp;
in:=(in+1)mod n;
signal(mutex);
signal(full);
until false;
end
consumer:begin
repeat
wait(full);
wait(mutex);
nextc:=buffer(out);
out:=(out+1)mod n;
signal(mutex);
signal(empty);
consumer the item in nextc;
until false;
end
parend
end

我尤其不明白nextc是什么类型,只能存放一个元素还是一个队列?还有根据记录型信号量的特点,生产者进程怎么被阻塞怎么被唤醒
展开
 我来答
木人羽
推荐于2017-11-23
知道小有建树答主
回答量:15
采纳率:0%
帮助的人:10.3万
展开全部
Var mutex,empty,full:semaphore:=1,n,0; // 定义三个信号量
buffer:array[0,...,n-1]of item; // 定义缓冲池,容量为n
in,out:integer:=0,0;
begin
parbegin
proceducer:begin // 生产者
repeat
.
.
.
producer an item nextp; // 生产一个产品
.
.
.
wait(empty); // 申请一个空缓冲区
wait(mutex); // 申请缓冲池的使用权
buffer(in):=nextp; // 将产品放入缓冲池中
in:=(in+1)mod n; // 下一个空缓冲区地址
signal(mutex); //释放缓冲池使用权
signal(full); // 释放一个满缓冲区
until false;
end
consumer:begin
repeat
wait(full);
wait(mutex);
nextc:=buffer(out);
out:=(out+1)mod n;
signal(mutex);
signal(empty);
consumer the item in nextc;
until false;
end
parend
end

nextp 应该是next proceducer的意思吧
nextc 应该是next consumer
貌似也不是什么变量,属于语言描述而已
下面的消费者也是差不多的。

至于生产者进程如何被阻塞和唤醒,因为程序中有一个 repeat语句,所以进程不断测试缓冲池是否有空缓冲区,以及缓冲池是否有其他进程使用。若两个条件不满足,则进入阻塞队列等待。若某一时刻两个条件都能满足,则能唤醒该进程。
建议楼主还是去找几题用C语言写的生产者消费者程序看吧,这个语言不太容易看懂
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式