读者-写者同步问题的写者优先实现

来源:互联网 发布:w10无法连接到windows 编辑:程序博客网 时间:2024/04/30 20:02

介绍

信号量的数据结构

信号量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;   //“正在读”的进程数,初值是0。int Wcount=0;   //“等待写”的进程数,初值是0。semaphore r=1;          //信号量,用于Rcount的互斥。semaphore w=1;          //信号量,用于Wcount的互斥。semaphore RWmutex=1;    //信号量,用于读者写者互斥。semaphore Wmutex=1;     //信号量,用于写者互斥。**writer**P(w);Wcount++;if Wcount==1 then //第一个写者进入时  P(RWmutex); //申请读写资源V(w);P(Wmutex);writing;V(Wmutex);P(w);Wcount--;if Wcount==0 then  V(RWmutex); //释放读写资源V(w);**Reader**P(w); //如果有写者在等待RWmutex,那么它肯定占有w,于是读者在这里会阻塞V(w); //立即释放掉,使写者随时可申请到wP(r);Rcount++;if Rcount==1 then //第一个读者进入时,   P(RWmutex); //如已有写者,其会被阻塞V(r);reading;P(r);Rcount--;If Rcount==0 then   V(RWmutex);V(r); 
0 0
原创粉丝点击