读者-写者问题

「读者-写者问题」是信号量的一个典型例子。由两组并发进程:读者和写者,共享一个文件 ,要求:

  • 允许多个读者同时执行读操作;
  • 只允许一个写者执行写操作;
  • 任一写者在完成写操作之前不允许其它读者或写者工作;
  • 写者执行写操作前,应让已有的写者和读者全部退出。

用图像可表示为

img-2024-04-10 19-09-39.png

信号量设置

在此问题中,缓冲区本身自然是一个临界资源,需要为其设置一个信号量。但是为了实现多读者同时访问,还应该准备一个读者计数器,当计数器大于零时,锁定缓冲区,等于零时才释放缓冲区给写者。

但是读者之间修改读者计数器时也构成了临界区,因此此问题一共涉及到两个临界区资源,分别是读者计数器和缓冲区,因此对应设计两个信号量 ReadCountBUF

  • 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);
	 }
}