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

进程互斥问题读者写者
reader () { // 读者进程
while(1){
P (mutex
) ; //互斥访问count变量
if (count
==0) //当第一个读进程读共享文件时
P(rw); //阻止写进程写
count++; //读者计数器加1
V (mutex
) ; //释放互斥变量count
reading; //读取
P (mutex
) ; //互斥访问count变量
count--; //读者计数器减1
if (count
==0) //当最后一个读进程读完共享文件
V(rw
) ; //允许写进程写
V (mutex
) ; //释放互斥变量 count
}
}

呼唤远方
浏览 259回答 3
3回答

LEATH

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

潇潇雨雨

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

DIEA

这是操作系统里面的读者写者问题写下伪代码: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
打开App,查看更多内容
随时随地看视频慕课网APP