读者问题:3种解决办法伪代码

1、读者优先:

semaphore rmutex = 1;
semaphore resource = 1;
int readcount = 0;

void reader()
{
	while(true)
	{
		wait(rmutex);
		if(readcount == 0)
			wait(resource);
		readcount++;
		signal(rmutex);
		
		......
		reading
		......
		
		wait(rmutex);
		readcount--;
		if(readcount == 0) 
			signal(resource);
		signal(rmutex); 
	}
} 
void writer()
{
	while(true)
	{
		wait(resource);
		
		.......
		writing;
		.......
		
		signal(resource);
	}
} 
int main()
{
	cobegin
		reader(); writer();
	coend
}


2、公平原则:

semaphore rmutex = 1;
semaphore resource = 1;
semaphore serviceQueue = 1;  //用于实现公平原则(按先来先服务原则排队,
							// 当等于1时信号量的阻塞队列队头获得执行权力,否则排后面) 
int readcount = 0;

void reader()
{
	while(true)
	{
		wait(serviceQueue);  
		wait(rmutex);  
		if(readcount == 0)
			wait(resource);
		readcount++;
		signal(rmutex);
		signal(serviceQueue);
		 
		......
		reading
		......
		
		wait(rmutex);
		readcount--;
		if(readcount == 0) 
			signal(resource);
		signal(rmutex); 
	}
} 
void writer()
{
	while(true)
	{
		wait(serviceQueue);
		wait(resource);
		
		.......
		writing;
		.......
		
		signal(resource);
		signal(serviceQueue);
	}
} 
int main()
{
	cobegin
		reader(); writer();
	coend
}

3、写者优先:


semaphore resource = 1;  //用于写者和写者、读者和写者互斥访问文件 
semaphore wmuter = 1; //用于写者和写者互斥访问writercount
semaphore rmutex = 1; //用于互斥访问readcount 
semaphore readTry = 1; //用于实现写者优先 
int readcount = 0;   //记录当前读者数量
int writercount = 0;  //记录当前写者数量

//模拟1:
//写者1(执行完第1部分,被剥夺处理机),读者1,写者2,写者1(执行刚才剩下的)
//当写者1写完了,先使用文件的是写者2(只有写者2也写完了且没有其他写者了,才会
//signal(readTry),读者才有机会用文件
//模拟2:
//读者1(执行完第1部分,被剥夺处理机),写者1,读者2,读者1(继续读)
//读者1读完后,先使用文件的是写者1 
void reader()
{
	while(true)
	{
		//第1部分 
		wait(readTry); 
		wait(rmutex);    
		if(readcount == 0)
			wait(resource);
		readcount++;
		signal(rmutex);
		siganal(readTry);
		//第1部分end
		 
		......
		reading
		......
		
		wait(rmutex);
		readcount--;
		if(readcount == 0) 
			signal(resource);
		signal(rmutex); 
	}
} 
void writer()
{
	while(true)
	{
		//第1部分 
		wait(wmutex);
		writercount++;
		if(writercount == 1)
			wait(readTry);
		sigal(wmutex);
		//第1部分end
	 
		wait(resource);
		.......
		writing;
		.......
		signal(resource);
		
		wait(wmutex);
		writercount--;
		if(writercount == 0)
			signal(readTry);
		signal(wmutex);
	}
} 
int main()
{
	cobegin
		reader(); writer();
	coend
}
  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值