为了账号安全,请及时绑定邮箱和手机立即绑定

我感觉去掉mutex这个信号量也没什么问题呀。能举个例子说明不能去掉吗

我感觉去掉mutex这个信号量也没什么问题呀。能举个例子说明不能去掉吗

PHP C
呼唤远方 2023-03-03 18:14:29
进程互斥问题读者写者reader () { // 读者进程while(1){P (mutex) ; //互斥访问count变量if (count==0) //当第一个读进程读共享文件时P(rw); //阻止写进程写count++; //读者计数器加1V (mutex) ; //释放互斥变量countreading; //读取P (mutex) ; //互斥访问count变量count--; //读者计数器减1if (count==0) //当最后一个读进程读完共享文件V(rw) ; //允许写进程写V (mutex) ; //释放互斥变量 count}}
查看完整描述

3 回答

?
LEATH

TA贡献1936条经验 获得超7个赞

可能会发生错误。比如:
1.第一个读者进入后(此时count==0),p了一下rw。
2.与此同时另一个读者也进入了,而此时count 尚未更新,仍为0,因此第二个读者也认为自己是第一个进来的,也去p了rw,但是rw已经被第一个读者p过了,因此这个读者会被一直阻塞,直到最后一个读者离开,释放了rw后才能被唤醒。若有后续读者在count更新前进来,那么这些读者同样会被阻塞。
而若设置了mutex互斥信号量,第二个读者只有在count更新后才能进来,就不会发生上述错误。

查看完整回答
反对 回复 2023-03-06
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

此方法是保证读者优先的方法,如果不设信号量,那么在V之后无法保证先行读者阻塞队列。也可能直接唤醒写者阻塞队列。设互斥信号量的目的是保证读者有序先行。

查看完整回答
反对 回复 2023-03-06
?
DIEA

TA贡献1820条经验 获得超3个赞

这是操作系统里面的读者写者问题写下伪代码:intreadcount=0;//读进程计数semaphorewriteblock=1;semaphoremutex=1;cobeginprocessreader_i(){P(mutex);readcount++;if(readcount==1)P(writeblock);//封锁写者进程V(mutex);{读资源A};P(mutex);readcount--;if(readcount==0)V(writecount);V(mutex);}processwriter(){P(writeblock);{写资源A};V(writeblock);}在Windows中,实现进程同步互斥可以使用mutex、event、semaphore等内核对象隐约记得些Win32API

查看完整回答
反对 回复 2023-03-06
  • 3 回答
  • 0 关注
  • 178 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号