读者写者问题写者优先代码

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

读者写者问题-写者优先代码

#include<stdio.h>

#include<stdlib.h>

int rcount=0;//正在读的读者数量

int wcount=0;//写者队列中等待写操作的写者数量

int rid=0;//读进程号

int wid=0;//写进程号

int w=1;//读写互斥信号量

char temp[300] = {'\0'};

int sign; //标识temp空的信号量0表示temp空

void WFwakeup();

void RFwakeup();

struct rqueue{//读者等待队列

int readers[200];

int index;

}rq;

struct wqueue{//写者等待队列

int writers[200];

int index;

}wq;

void read(){

int i = 0;

rid++;

if(rcount == 0){//当前没有读进程在读可能有写进程在写可能CPU空闲if(w==1) {//如果CPU空闲,读者拿到CPU

w--;// 相当于一个P操作

rcount++;

if(temp[0] == '\0'){

sign = 0;

rq.readers[rq.index++]=rid;//将读者进程加入等待队列

WFwakeup();

return;

}//if

printf("读者%d正在读\n",rid);

for(i = 0;i < 300;i++){//读取temp内容即写者写的内容

if(temp[i] == '\0'){

printf("\n");

return;

}//if

printf("%c",temp[i]);

}//for

}//if

else{//写者线程正在执行

printf("有写者在写不能读!\n");

rq.readers[rq.index++]=rid;//将读者进程加入等待队列

}//else

}//if

else{//rcount !=1 则知道当前已经有读者在读,读读不互斥,则这个读者可以直接进来了读

printf("读者%d正在读\n",rid);

for(i = 0;i < 300;i++){

if(temp[i] == '\0'){

printf("\n");

return;

}

printf("%c",temp[i]);

}//for

}//else

}

//***************************写进程写操作

void write(){

wid++;

if(w == 0){

if(rcount != 0 ){//有读者进程在执行

printf("有读者在读不能写!\n");

wq.writers[wq.index++]=wid;//将写者进程加入等待队列

wcount++;

return;

}

if(rcount == 0 ){//rcount == 0则当前无读者,但w = 0,所以有写者在写

printf("有写者在写不能写!\n");

wq.writers[wq.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("写者已经写完\n");

sign = 1;//temp中已经有内容要置1

for(i=0;i<=wq.index;i++){// index为当前写者队列中的等待进程数

if(wq.writers[i]!=0){

writer_wait=true; //确实有写者在等待

printf("等待的写者%d正在写\n 请输入要写的内容\n",wq.writers[i]); w = 0;

scanf("%s",temp);

wq.writers[i]=0;

wcount--;

break;

}

}

if(!writer_wait){//没有写者等待,看是

否有读者等待

for(int i=0;i<=m;i++){//检查写者等待队列

if(rq.readers[i]!=0){

w = 0;

printf("等待的读者%d正在读\n",rq.readers[i]);

for(j = 0;j < 300;j++){

if(temp[j] == '\0'){

printf("\n");

rq.index--;

相关文档
最新文档