读者-写者问题

读者优先:
在这里插入图片描述

int readcount = 0;
semaphore mutex = 1, wrt = 1;

Reader :
while(true){
	wait(mutex);
	readcount++;
	if(readcount == 1)
		wait(wrt);
	signal(mutex);
	 ...
	 	reading is performed
	 ... 
	wait(mutex);
	readcount--;
	if(readcount == 0)
		signal(wrt);
	signal(mutex);
}

Writer:
while(true){
	wait(wrt);
	...
		writing is performed;
	...
	signal(wrt);
}

写者优先:
在这里插入图片描述

int readCount = 0, writeCount = 0;
semaphore fileSrc = 1, read =1, readCountSignal = 1, writeCountSignal = 1;

Reader:
while(true){
	wait(read);   //申请令牌
	wait(readCountSignal); 
	
	if(readCount == 0)
		wait(fileSrc);
	readCount++;
	
	signal(readCountSignal);
	signal(read);	//释放令牌
	...
		perform read operation
	...
	wait(readCountSignal);
	readCount--;
	if(readCount == 0)
		signal(fileSrc);
	signal(readCountSignal);
}

writer:
while(true){
	wait(writeCountSignal);
	if(writeCount == 0)
		wait(read);
	writeCount++;
	signal(writeCountSignal);
	
	wait(fileSrc);
	...
		perform write operation
	...
	signal(fileSrc);
	
	wait(writeCountSignal);
	writeCount--;
	if(writeCount == 0)
		signal(read);
	signal(writeCountSignal);
}

读写公平:
1.优先级相同。
2.写者、读者互斥访问。
3.只能有一个写者访问临界区。
4.可以有多个读者同时访问临界资源。

int readCount = 0;
semaphore mutex = 1, rw = 1, w = 1;

Reader:
while(true){
	wait(w);
	wait(mutex);
	if(readCount == 0)
		wait(rw);
	readCount++;
	signal(mutex);
	signal(w);
	...
		perform read operation
	...
	wait(mutex);
	readCount--;
	if(readCount == 0)
		signal(rw);
	signal(mutex);
}

Writer:
while(true){
	wait(w);
	wait(rw);
	...
		perform write operation
	...
	signal(rw);
	signal(w);
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值