2.3.9 读者写者问题
读者写者问题是十分经典的进程同步的问题,问题描述如下:读进程与写进程共享文件,但是写进程必须与其他进程互斥发生。
根据以上的题目要求我们可以得出一些互斥关系:写进程与写进程互斥,读进程与写进程互斥
我们可以设置一个互斥信号量rw来实现对互斥信号的共享访问
semaphore rw=1; //用于实现对共享文件的互斥访问
writer (){
while(1){
P(rw); //写之前“加锁”
写文件…
V(rw); //写完了“解锁”
}
}
reader (){
while(1){
P(rw); //读之前“加锁”
读文件…
V(rw); //读完了“解锁”
}
}
但是这样简单的上锁解锁会导致读文件不能同时进行,就像我们进房间,打开门之后接着关上了门,后面的人当然没办法继续进来了。按照日常经验,开门应该有第一个人完成而关门应该有最后一个人完成,于是我们再次引入count计数器,记录正在读的进程数。
semaphore rw=1; //用于实现对共享文件的互斥访问
int count = 0; //记录当前有几个读进程在访问文件
semaphore mutex = 1;//用于保证对count变量的互斥访问
writer (){
while(1){
P(rw); //写之前“加锁”
写文件…
V(rw); //写完了“解锁”
}
}
reader (){
while(1){
if(count==0) //由第一个读进程负责
P(