第二章 信号量机制seamphore(3)

整形信号量

wait(s){

while(s<=0) do no-op;

s:=s-1;}

signal(s){

s:=s+1;}

记录型信号量

P操作:

wait(){

s.value=s.value-1;

if(s.value<0) then block(s.l);

V操作:

signal(){

s.value=s.value+1;

if(s.value<=0) then wakeup(s.l);

 

 

1. 生产者—消费者问题

seamphore space=n,goods=0,mutex=1;

 

void producer(){

while(1){

wait(space);

wait(mutex);

生产;

signal(mutex);

signal(goods);}}

 

void consumer(){

while(1){

wait(goods);

wait(mutex);

取走;

signal(mutex);

signal(goods);}}

 

筷子是临界资源,在一段时间内只允许一个哲学家使用。为实现对筷子的互斥使用,用一个信号量表示一只筷子,五个信号量构成信号量数组。    

Var chopstick: array [0, …, 4] of semaphore;     所有信号量均被初始化为1。

第i 位哲学家的活动可描述为:

while(1){

wait(c[i]);

wait(c[i+1]);

eat;

signal([i]);

signal([i+1] mod 5);

think;

}

 

 

reader(){

repeat

wait(rmutex);

if (readcount=0) then wait(wmutex); 防止写程序进入与读程序冲突;

readcount = readcount+1;

signal(rmutex);

...

read;

...

wait(rmutex);

readcount = readcount-1;

signal(rmutex);

if(readcount=0) then signal(wmutex);

until false;

}

 

下棋:

1、执黑先行;

2、先抢到先下

 

full=cutok=payment=receipt=0;

 

consumer(){

while(1)

{

signal(full);

wait(cutok);

付费;

signal(payment);

wait(receipt);

}

}

lifashi(){

while(1){

wait(full);

signal(cutok);

wait(payment);

signal(receipt);

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值