读者优先与写者优先---信号量实现

  以前在看操作系统相关书籍的时候,写过相关的文章,那时候是照着书大概敲上去的,今天在温习相关知识的时候又看到了这个点,于是便打算写一串伪代码来实现。
  (使用PV操作,sem即信号量)

读者优先:

  读者优先,即仅当读者为0时,写者才可写入。

sem ri=1,ws=1  //ri用于对rcnt这个变量产生互斥,ws为对写者产生互斥
int rcnt=0//读者数量

reader:
	V(ri)
	rcnt++
	if(rcnt==1)
	    V(ws)
	P(ri)
	read()
	V(ri)
	rcnt--
	if(rcnt==0)
	    P(ws)
	P(ri)                    
	
writer:
	V(ws)
	write()
	P(ws)
写者优先:

  写者优先,这里定义为,当写者表明想写入的时候,不允许有新的读者进入。
  在编写该代码的时候我犯了一个错误,没有reader中的v(z)和p(z)操作,就会仍旧可能会出现读者优先的状况,因为在writer中有对rs的占用V操作,会造成多个reader同时与writer进程一起竞争rs的所有权,所以需要多一个额外的信号量(如下面代码中的z)去让多个reader排队。

sem ri=1,wi=1,ws=1,rs=1,z=1 
int wcnt=0,rcnt=0

reader:
	V(z)
	V(rs)
	V(ri)
	rcnt++
	if(rcnt==1)
	  V(wsem)
	P(ri)
	P(rs)
	P(z)
	read()
	V(ri)
	rnct--
	if(rcnt==0)
	   P(wsem)
	P(ri)
	

writer:
	V(wi)
	wcnt++
	if(wcnt==1)
	    V(rs)
	P(wi)
	V(wsem)
	writer()
	V(wi)
	wcnt--
	if(wcnt==0)
	    P(rs)
	P(wi)
	P(wsem)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值