天天看点

读者-写者同步问题的写者优先实现介绍代码

介绍

信号量的数据结构

信号量semaphore s
包含:一个初始值为正的整数: s.count
    一个初始为空的队列:   s.queue
           

其上定义了三个原子操作:

1. 初始化s

2. semWait 操作(P操作)使信号量减1。若值为负,则执行semWait的进程被阻塞。否则进程继续执行。

3. semSignal操作(V操作)使信号量加1。若值小于或等于零,则被semWait操作阻塞的进程被解除阻塞。

物理意义

S.count为正时表示资源的个数

S.count为负时表示等待进程的个数

P操作分配资源

V操作释放资源

代码

int Rcount=;   //“正在读”的进程数,初值是0。
int Wcount=;   //“等待写”的进程数,初值是0。
semaphore r=;          //信号量,用于Rcount的互斥。
semaphore w=;          //信号量,用于Wcount的互斥。
semaphore RWmutex=;    //信号量,用于读者写者互斥。
semaphore Wmutex=;     //信号量,用于写者互斥。

**writer**
P(w);
Wcount++;
if Wcount== then //第一个写者进入时
  P(RWmutex); //申请读写资源
V(w);
P(Wmutex);
writing;
V(Wmutex);
P(w);
Wcount--;
if Wcount== then
  V(RWmutex); //释放读写资源
V(w);


**Reader**
P(w); //如果有写者在等待RWmutex,那么它肯定占有w,于是读者在这里会阻塞
V(w); //立即释放掉,使写者随时可申请到w
P(r);
Rcount++;
if Rcount== then //第一个读者进入时, 
  P(RWmutex); //如已有写者,其会被阻塞
V(r);
reading;
P(r);
Rcount--;
If Rcount== then 
  V(RWmutex);
V(r); 
           

继续阅读