操作系统--信号量经典同步问题之读者优先问题
来源:互联网 发布:淘宝网银怎么开通 编辑:程序博客网 时间:2024/06/05 15:02
优先问题实际上是指用信号量来优先级抢占。这里读者优先有以下两个内涵:
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阻塞。而读者线程则可以优先排在等待队列中,因此可以实现抢占线程。不过,如果有大量读者线程时,可能会造成写者线程饥饿现象。
- 操作系统--信号量经典同步问题之读者优先问题
- 操作系统--信号量经典同步问题之写者优先问题
- 操作系统实验之八读者优先问题
- 操作系统清华大学版笔记(十) 信号量、管程、条件互斥、经典同步问题(读者写者、哲学家问题)
- 操作系统进程同步互斥经典问题之读者写者问题
- 使用信号量解决读者写者问题--读者优先
- 有名信号量实现读者-写者问题(读者优先)
- 读者写者问题之读者优先
- 优先读者/写者问题—操作系统
- 使用信号量解决读者写者问题--写者优先
- 读者写者问题--使用信号量的读者优先与写者优先程序分析
- 读者写者问题--使用信号量的读者优先与写者优先程序分析
- 操作系统之经典进程同步问题
- 操作系统之信号量解决同步互斥问题
- 进程同步的经典问题1——读者写者问题(写者优先与公平竞争)
- 进程同步的经典问题1——读者写者问题(写者优先与公平竞争)
- 进程同步的经典问题1——读者写者问题(写者优先与公平竞争)
- 操作系统的优先读者和优先写着的读者/写着问题
- python多线程编程(4): 死锁和可重入锁
- [bigdata-013]某app用户行为分析
- 单项散列加密
- Yii的url重写
- 机器学习&图像处理常用的特征汇总
- 操作系统--信号量经典同步问题之读者优先问题
- Python公有私有申明定义
- 学会骗人,是重要的生存技能!
- SUSE 11 SP4 Install NTP
- 带背景图的按钮
- windows下使用xmanger管理centos桌面
- Android反调试之 AntiEmulator 检测安卓模拟器
- ubuntu php安装 make Generating phar.php 卡住
- 欢迎使用CSDN-markdown编辑器