啧。这几个月在肝GPA,没有好好研究代码,最近期末重新看操作系统,觉得这个问题非常有趣。
题目不用说了。
前提:
可以允许多个读者读,但是只有一个写者写。
写者优先:在有读者读的时候,除非读者是在临界区内正在读,否则在任何剩余时间写者都应该能够抢夺读者。
而要尽量保证写者写的时候,读者不能抢夺写者的访问权。
int readerCount = 0, writerCount = 0; semaphore x(1),y(1),z(1),rsem(1),wsem(1); //reader void reader() { while(true){ wait(z);// z 保证在writer处于critical section时,只有一个reader被堵在了rsem上,其余的reader被堵在了z上,这使得,当一个reader获得了rsem在它处于critical section时,若此时来了一个writer,这个writer只需要等待这一个reader结束然后可以抢占,若没有z,该writer可能要与多个reader抢占访问权 wait(rsem); // rsem writer能够抢占reader的访问权 wait(x); // x 只用来确保readerCount的原子性操作 readerCount++; if(readerCount == 1) wait(wsem);// 在有读者在critical section中读时,防止此时有writer要修改critical section中的数据 signal(x); signal(rsem); signal(z); READ(); wait(x); readerCount--; if(readerCount == 0) signal(wsem); // readerCount是此时critical section中的reader的数量,要保证critical section中的所有的reader全部读完离开之后,才能允许writer进入写数据 signal(x); } } //writer void writer() { while(true){ wait(y);// y用来保证writerCount 的原子性操作 writerCount++; if(writerCount == 1) wait(rsem); // 防止此时reader进入读数据 signal(y); wait(wsem); // 此时只要抢占读者的或上一个写者的访问权 WRITE(); signal(wsem); wait(y); writerCount--; if(writerCount == 0) signal(rsem); // 只有所有写者全部写完,才允许读者进行读 signal(y); } }