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

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

你可能感兴趣的:(操作系统)