102读者与写者1.png
解决方案一 (读者优先)当读者源源不断时,写者就会被饿死,永远没有机会执行写操作。
semaphore rw = 1;//对于共享文件的互斥
int count = 0;//读进程计数
semaphore w=1;//写之间互斥
semaphore mutex=1;//保证对count变量的互斥访问,访问和修改该值的操作应该一气呵成
writer{
while(1){
P(rw);
写文件;
V(rw);
}
}
reader{
while(1){
P(mutex);
if(count==0){
P(rw);
}
count++;
V(mutex);
读文件;
P(mutex);
count--;
if(count==0){
V(rw);
}
V(mutex);
}
}
解决方案二(读写公平法) 借助w 搞一个排队的队列
104读者与写者(读写公平法).png
semaphore rw = 1;//对于共享文件的互斥
int count = 0;//读进程计数
semaphore w=1;//写优先
semaphore mutex=1;//保证对count变量的互斥访问,访问和修改该值的操作应该一气呵成
writer{
while(1){
P(w);
P(rw);
写文件;
V(rw);
V(w);
}
}
reader{
while(1){
P(w);
P(mutex);
if(count==0){
P(rw);
}
count++;
V(mutex);
V(w);
读文件;
P(mutex);
count--;
if(count==0){
V(rw);
}
V(mutex);
}
}