使用信号量解决读者写者问题--读者优先

来源:互联网 发布:算法统宗阅读 编辑:程序博客网 时间:2024/04/30 18:07
<pre>//读者优先int readcount = 0;semaphore x = 1, wsem = 1;void reader(){    while(true){        semWait(x);        readcount ++ ;        if(readcount == 1)            semWait(wsem);        semSignal(x);        READUNIT();//读数据        semWait(x);        readcount --;        if(readcount == 0)            semSignal(wsem);        semSignal(x);    }}void writer(){    while(true){        semWait(wsem);        WRITEUNIT();//写数据        semSignal(wsem);    }}</pre>

信号量x保证readCount被正确更新.wsem用于文件读写的互斥.
分析:
1:对于写进程. 如果一个写执行semWait(wsem),然后写WRITEUNIT();对于其他写进程明显回被阻塞在wsem上.而对于读进程,第1个读进if(readcount == 1) emWait(wsem);也会被阻塞在 wsem上.而后续的读进程会被阻塞在第一个semWait(x);上.

2:如果多个读进程要读文件,那么第一个读进程在if(readcount == 1) emWait(wsem);时如果有写进程在写,转1.如果无写进程,那么wsem-1=0; 这样就保证了读的时候写进程会被阻塞在wsem上. 而后续的读进程可以直接读文件.当所有读进程都读完时if(readcount==0)semSignal(wsem); 阻塞在wsem上的写进程就可以写了.

综上所述:
(1)只有当所有读进程都读完了,写进程才可以写.
(2)或者一个写进程写完后,semSignal(wsem),可能会被读进程抢占if(readcount == 1) emWait(wsem);而写进程无法抢占读进程.

所以为读优先;

0 0