读者-写者问题
互斥制约与合作制约双重关系的进程同步问题描述是:
一个被多个进程共享的文件、记录或数据结构,允许进程对其执行读、写操作。读进程称为读者,写进程称为写者。其允许多个进程同时读取,但只要有一个进程在读,就不能有进程对其进行写操作。同样,只要有一个进程在写,其它进程的读、写操作都不允许。
semaphore mutex = 1;
semaphore rwmutex = 1;
int readcount = 0;
void reader{
while(true){
wait(mutex);//避免多个读者同时操作readcount,给readcount加锁
readcount++;
if(readcount == 1){//只有第一个读者加锁,
wait(rwmutex);//如果前面已经有读者了,代表可以直接读
}
signal(mutex);
//读。。。
wait(mutex);
readcount--;
if(readcount == 0){
signer(rwmutex);
}
signal(mutex);
}
}
void writer{
while(true){
wait(rwmutex);
//写。。。
signer(rwmutex);
}
}
读者-写者(2)
在前面的基础上加了个条件,同一时刻最多又能有m个读者同时读
//用信号量集
semaphore remutex = m;
semaphore wrmutex = 1;
void reader{
while(true){
//remutex, 1, 1
//第一个1 表示 remutex的值如果小于1(读者数已经到ml),就阻塞,第二个1代表每次remutex减1
//wrmutex, 1, 0 表示 wrmutex的值如果小于1(说明已经有写者了),就阻塞,0代表读者不影响写者
Swait(remutex, 1, 1 ; wrmutex, 1 ,0);
//读。。。
Ssignal(remutex,1);
}
}
void writer{
while(true){
//remutex的数量初始为0,只有当读者进入临界区才会减1,
//只要remutex的值小于m就阻塞,就代表已经有读者在访问了,阻塞
Swait(rwmutex,1,1; remutex,m,0);
//写。。。
Ssigner(rwmutex,1);
}
}