0%

信号量之读者写者问题——写者优先

读者写者问题实现写者优先
要求:

  • 写者线程的优先级高于读者线程。
  • 当有写者到来时应该阻塞读者线程的队列。
  • 当有一个写者正在写时或在阻塞队列时应当阻塞读者进程的读操作,直到所有写者进程完成写操作时放开读者进程。
  • 当没有写者进程时读者进程应该能够同时读取文件。

readcountwritecount表示读者写者数量,mutex1mutex2实现互斥
r为读者写者队列,但仅允许一个读进程排队
mutex3其他读者在这个信号量上排队

伪代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int readcount=0, writecount=0; 
semaphore mutex1=1, mutex2=1, mutex3=1, w=1, r=1 ;

读者进程:
P(mutex 3);
P(r);
P(mutex 1);
readcount++;
if (readcount == 1 ) P(w);
V(mutex 1);
V(r);
V(mutex 3);
reading is performed
P(mutex 1);
readcount --;
if (readcount == 0 ) V(w);
V(mutex 1);

写者进程:
P(mutex 2);
writecount++;
if (writecount == 1 )
P(r);
V(mutex 2);
P(w);
writing is performed
V(w);
P(mutex 2);
writecount --;
if (writecount == 0) V(r);
V(mutex 2);