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

介绍

信号量的数据结构

信号量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); //立即释放掉,使写者随时可申请到w
P(r);
Rcount++;
if Rcount==1 then //第一个读者进入时, 
  P(RWmutex); //如已有写者,其会被阻塞
V(r);
reading;
P(r);
Rcount--;
If Rcount==0 then 
  V(RWmutex);
V(r); 
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值