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的互斥访问 } }