操作系统--信号量经典同步问题之读者优先问题

优先问题实际上是指用信号量来优先级抢占。这里读者优先有以下两个内涵:

1. 当读者线程正在访问临界区时,其他的读者线程可以优于写者线程访问临界区,只有所有的读者线程都执行完毕后,写者线程才能访问临界区。即实现读者优先。

2. 当写者线程正在访问临界区时,等待访问临界区的读者线程如何抢先于其他写者进程访问访问临界区,等到读者线程都执行完毕后,写者线程才能访问临界区。


有些教材认为读者优先只是实现第一点,因为如果实现第二点的话,当读者线程很多写者线程很少时,会造成写者线程处于饥饿状态。


以下是两种情况的伪代码:

 

int readCount; // readCount 是共享变量

semaphore  WriteMutex=1, CountMutex=1, x=1;

void Reader()
{

while(1)

{

sem_wait(CountMutex); // 信号量CountMutex用来实现互斥,即防止多个读者进程同时对readCount进行操作。

 readCount++;

if(readCount == 1) // 当readCount=1时,即此时没有其他读者进程在访问临界区,为了实现抢占应锁住写者线程。这样其他后来的进程可以直接去实现读操作,

写者线程只能等待。

sem_wait(WriteMutex);

sem_post(CountMutex);

read(); // 读取临界区数据


sem_wait(CountMutex) //同上

readCount --;

if(readCount == 0)

sem_post(WriteMutex)  // readCount=0时,表明此时所有的读者线程都执行完毕,释放锁,允许写者线程访问临界区。

sem_post(CountMutex)

}
}


void  Writer()
{

sem_wait(WriteMutex)

write() //向临界区写数据

sem_post(WriteMutex)
}

以上代码即可以实现上述第一点,即当读者线程访问临界区时,其他读者线程可以优于写者线程进行访问。只有当所有读者线程都执行完毕后,写者线程才能访问临界区。而当写者线程正在访问临界区时,读者线程无法实现抢占。

其实想要实现第二点只需在Writeer()中再加一对信号量即可。代码如下

void Writer()
{

sem_wait(x); //信号量X即用来实现第二点

sem_wait(WriteMutex) 

write() //向临界区写数据

sem_post(WriteMutex)

sem_post(x);
}

以上代码中,用信号量x来实现写者线程获得临界区资源时,读者线程优先于写者线程。 因为当写者线程获得临界区访问权时,其他的写者线程被信号量x阻塞。而读者线程则可以优先排在等待队列中,因此可以实现抢占线程。不过,如果有大量读者线程时,可能会造成写者线程饥饿现象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值