「读者-写者问题」是信号量的一个典型例子。由两组并发进程:读者和写者,共享一个文件
用图像可表示为
在此问题中,缓冲区本身自然是一个临界资源,需要为其设置一个信号量。但是为了实现多读者同时访问,还应该准备一个读者计数器,当计数器大于零时,锁定缓冲区,等于零时才释放缓冲区给写者。
但是读者之间修改读者计数器时也构成了临界区,因此此问题一共涉及到两个临界区资源,分别是读者计数器和缓冲区,因此对应设计两个信号量 ReadCount
和 BUF
。
Mutex_ReadCount
,阅读者计数器信号量,初始值为 0,范围为 Mutex_BUF
,缓冲区信号量,初始值为 1,范围为 读者可以表示为
process reader_i( ) {
while(1){
/*阅读者计数器登记 */
P(Mutex_ReadCount);
readcount++;
/*第一个阅读者去申请BUF*/
if(readcount==1)
P(Mutex_BF);
V(Mutex_ReadCount);
/*读文件*/;
/*阅读者计数器注销 */
P(Mutex_ReadCount);
readcount--;
/*最后一个阅读者去释放BUF*/
if(readcount==0)
V(Mutex_BF);
V(Mutex_ReadCount);
sleep(10); }
}
写者可以表示为
process writer_j() {
while (1) {
P(Mutex_BF);
/*写文件*/;
V(Mutex_BF);
sleep(10);
}
}