int readcount, writecount = 0; //readcount,writecount都等于0
semaphore rsem, wsem = 1; // rsem,wsem都等于1
semaphore x,y,z = 1; // xyz都等于1
void reader(){
while(1){
wait(z); //用来保证写者优先.
wait(rsem); //判断有没有写进程在临界区,有的话等待,没有的话不让新的写进程进来..由于wait(z)保证在这里最多只有1个读者
wait(x); //开始对readcount的互斥访问
readcount++; //更新读进程数量
if (readcount==1)
wait(wsem); //第一个读进程需要判断是否有写进程在进行写操作,有的话需要等待,没有的话不让写进程进行新写操作.这里也会导致读者阻塞.
signal(x); //结束对readcount的互斥访问
signal(rsem); //归还锁,让写进程可以进临界区
signal(z);
doReading();
wait(x); //开始对readcount的互斥访问
readcount--; //更新读进程数量
if (readcount==0)
signal(wsem); //最后一个离开临界区的读进程需要归还锁,让写进程可以进行写操作
signal(x); //结束对readcount的互斥访问
}
}
void writer(){
while(1){
wait(y); //开始对writecount的互斥访问
writecount++; //更新写进程数量
if (writecount==1)
wait(rsem); //第一个写进程需要判断是否有读进程在临界区,有的话需要等待,没有的话不让新的读进程进来
signal(y); //结束对writecount的互斥访问
wait(wsem); //限制同一时刻只能有一个写进程进行写操作
doWriting();
signal(wsem); //结束对写操作的限制
wait(y); //开始对writecount的互斥访问
writecount--; //更新写进程数量
if (writecount==0)
signal(rsem); //最后一个离开临界区的写进程需要归还锁,让读进程可以进临界区
signal(y); //结束对writecount的互斥访问
}
}
来源:https://www.cnblogs.com/hankskfc/archive/2010/12/06/1898106.html