第一类读者-写者问题:读者优先
除非有写者在写文件,否则没有一个读者需要等待。
分析思想:
读者到:
1)无读者、写者,新读者可以读
2)有写者等,但有其它读者正在读,则新读者也可以读
3)有写者写,新读者等
写者到:
1)无读者,新写者可以写
2)有读者,新写者等待
3)有其它写者,新写者等待
信息量:
readcount = 0 ——记录当前正在读的读者进程数,这是一个共享变量,需要互斥使用
mutex = 1 ——互斥信息量
write = 1 ——用于写者互斥,或第一个读者和最后一个读者与写者互斥
READ:
Repeat;
P(mutex);
readcount:=readcount+1;
if(readcount=1)
P(write);
V(mutex);
读文件
P(mutex);
readcount:=readcount-1;
if(readcount=0)
V(write);
V(mutex);
Until false
WRITE:
Repeat
P(write);
写文件
V(write);
Until false;
1.2 第二类读者-写者问题:写者优先
一旦一个写者到来,它应该尽快对文件进行写操作。则新来到的读者不允许进行读操作。
分析思想:
读者到:
1) 无读者且无写者,新读者读
2) 有读者但无写者等待,新读者读
3) 有读者但有写着等待,读者等待
4) 有写者在写,新读者等待
写者到:
1) 无读者且无写者,新写者写
2) 有读者在读,新写者等待
3) 有写者写,新写者等待
信息量:
read:=1 ——读者信息量,用于第一个写者与读者互斥
readcount:=0 ——记录当前读者的进程数
mutex:=1 ——互斥信息量
writecount:=0 ——记录当前写者排队的进程数
write:=1 ——写者信息量,用于写者互斥,第一个读者与写者互斥
mutex2:=1 ——互斥信息量
READ:
Repeat
P(read)
P(mutex)
readcount:=readcount+1;
if(readcount=1)
P(write)
V(mutex)
V(read)
读文件
P(mutex)
readcount:=readcount-1
if(readcount=0)
V(write)
V(mutex)
Until false
WRITE:
Repeat
P(mutex2)
writecount:= writecount+1
if(writecount=1)
P(read)
V(mutex2)
P(write)
写文件
V(write)
P(mutex2)
writecount:=writecount-1
if(writecount=0)
V(read)
V(mutex2)
Until false;