《读者写者问题写者优先代码》由会员分享,可在线阅读,更多相关《读者写者问题写者优先代码(4页珍藏版)》请在金锄头文库上搜索。
1、读者写者问题-写者优先代码#include<stdio.h>#include<stdlib.h>int rcount=0;正在读的读者数量int wcount=0;写者队列中等待写操作的写者数量 int rid=O;读进程号int wid=O;写进程号int w=1;读写互斥信号量char temp300 = '0'int sign; 标识temp空的信号量 0表示temp空void WFwakeup();void RFwakeup();struct rqueue读者等待队列int readers200;int index;rq;struct wqueu
2、e写者等待队列int writers200;int index;wq;void read()int i = 0;rid+;if(rcount = 0)当前没有读进程在读 可能有写进程在写 可能CPU空闲if(w=1) /如果CPU空闲,读者拿到CPUw-; 相当于一个P操作rcount+;if(temp0 = '0')sign = 0;rq.readersrq.index+=rid;将读者进程加入等待队列WFwakeup();return;/ifprintf("读者d 正在读n",rid); for(i = 0;i &It; 300;i+)读取temp内容
3、即写者写的内容 if(tempi = '0')printf("n");return;/ifprintf("%c",tempi);/for/ifelse写者线程正在执行printf("有写者在写不能读! n");rq.readersrq.index+=rid;将读者进程加入等待队列/else/ifelse/rcount !=1 则知道当前已经有读者在读,读读不互斥,则这个读者可以直接进来 了读printf("读者d 正在读n",rid);for(i = 0;i < 300;i+)if(tempi
4、 = '0')printf("n");return;printf("%c",tempi);/for/else/写进程写操作void write() wid+;if(w = 0)if(rcount != 0 )/有读者进程在执行 printf("有读者在读不能写! n"); wq.writerswq.index+=wid;/将写者进程加入等待队列 wcount+;return;if(rcount = 0 )/rcount = 0则当前无读者,但w = 0,所以有写者在写 printf("有写者在写不能写! n&
5、quot;);wq.writerswq.index+=wid;将写者进程加入等待队列 wcount+;return;if(w = 1)w-;printf("写者d正在写n请输入要写的内容",wid); scanf("%s",temp);/while/if/写者优先唤醒void WFwakeup() int i = 0;int j = 0;int m;m = rq.index;/n = wq.index;if(rcount = 0)/当前无读进程,是写者在写 -停止运行写进程bool writer_wait=false;w=1;printf("写
6、者已经写完n");sign = 1;/temp中已经有内容 要置1for(i=0;i<=wq.index;i+)index为当前写者队列中的等待进程数if(wq.writersi!=0)writer_wait=true;/确实有写者在等待printf("等待的写者d正在写n请输入要写的内容n",wq.writersi); w = 0;scanf("%s",temp);wq.writersi=0;wcount-;break;if(!writer_wait)没有写者等待,看是否有读者等待for(int i=0;i&l t;=m;i+)检查写者
7、等待队列if(rq.readersi!=0)w = 0;printf("等待的读者d 正在读n",rq.readersi); for(j = 0;j < 300;j+)if(tempj = '0')printf("n");rq.index-;break;/ifprintf("%c",tempj);/forrq.readersi=0;rcount+;/if/for/if/ return;/ifelse/rcount != 0读者正在读,stop读 此时若有等待必为写者rcount=0;w = 1;printf(&q
8、uot;读者已经读完n");for(int i=0;i&l t;=wq.index;i+) 检查写者等待队列if(wq.writersi!=0)w = 0;printf("等待的写者d正在写n请输入要写入的内容",wq.writersi); scanf("%s",temp);wq.writersi=0;wcount-;break;/if/for void main()char i;printf("=n 0.显示主菜单n 1.创建读者进程n 2.创建写者进 程n 3.结束当前执行的进程n 4.退出程序n=n");doprint
9、f("当前队列中有读者:%d 个 写者:%d 个n",rq.index,wcount); scanf("%s",&i);switch(i)case '0':printf("=n 0.显示主菜单n 1.创建读者进程n 2.创建写者进 程n 3.结束当前执行的进程n 4.退出程序n=n");break;case '1':read();break;case '2': write();break;case '3':WFwakeup();break;case '4':exit(0);default:printf("输入错误请重新输入n"); while(true);