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