您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 读者-写者问题C++源代码
读者——写者问题C++程序(原创作品)演示效果图:程序完整代码:#includewindows.h#includeiostream.h#includefstream.h#includestring.h#includestring#includestdlib.h//包含清屏头文件//全局变量intempty=1;//信号量intwrIn=1;//信号量intmax;inttemp[30];int*wait,*next;intcount=0;//记录已经完成操作的线程数intwaitSemapore;inttype;//类型记录intwritc=1;intreadc=1;voidreader()/////////////////////////////////////////////////////读者函数开始{empty--;//P操作改变信号量cout读者获得资源(;SYSTEMTIMEsys;GetLocalTime(&sys);//输出系统时间cout系统时间:sys.wHour:sys.wMinute:sys.wSecond:sys.wMilliseconds)endl;coutendl*读者正在进行读操作...endl;//empty++;//信号量count++;}/////////////////////////////////////////////////////////读者函数结尾voidwriter()//////////////////////////////////////////////////写者函数开始{empty--;//P操作改变信号量wrIn--;//P操作改变信号量cout写者writc获得资源(;SYSTEMTIMEsys;GetLocalTime(&sys);//输出系统时间cout系统时间:sys.wHour:sys.wMinute:sys.wSecond:sys.wMilliseconds)endl;cout请输入线程要写入的内容,以/结尾endl;charch='a';ofstreamoutfile(f.txt,ios::out|ios::app);if(!outfile){cerropenfileerror!endl;abort();}while(ch!='/'){cinch;outfilech;}coutendl*写者writc正在进行写操作..endl;outfile.close();count++;//wrIn++;//V操作改变信号量//empty++;//V操作改变信号量}//////////////////////////////////////////////////////////////写者函数结尾voidcodeIn()/////////////////////////////////////////////////////////////////输入界面{intru;cout请输入你要创建多少个线程:endl;cinmax;for(inti=0;imax;i++){cout你所要创建的第i+1个线程类型为:1.读者2.写者endl;cinru;///////////////if(ru==1||ru==2)temp[i]=ru;elsecout输入有误!请重新输入endl;/////////////判断错误if(i==max-1)//录入最后一个线程类型操作{//system(cls);//清屏HANDLEhOut;hOut=GetStdHandle(STD_OUTPUT_HANDLE);//设置输出字体颜色redSetConsoleTextAttribute(hOut,FOREGROUND_RED|FOREGROUND_INTENSITY);coutendl输入完毕!endl;hOut=GetStdHandle(STD_OUTPUT_HANDLE);//设置输出字体背景SetConsoleTextAttribute(hOut,BACKGROUND_GREEN|BACKGROUND_INTENSITY);for(intj=0;jmax;j++)//////////////////输出录入结果{cout线程j+1为:;if(temp[j]==1)cout读者endl;elsecout写者endl;}///////////////////////////////输出录入结果cout下面将进行动态演示:endlendl;system(pause);coutendl;}//录入最后一个线程类型操作}//录入界面结束}}/////////////////////////////////////////////////////////codeIn()intmain()/////////////////////////////////////////////////主函数{codeIn();//录入界面wait=&temp[0];while(wait&temp[max]&&countmax){waitSemapore=1;next=wait;while(*next==1||*next==2)//线程调用算法{if(*next==1)//reader{if(empty==1||(empty==0&&wrIn==1&&*wait!=2))//体现写者优先{reader();//调用读者函数type=1;}else{cout[读者此时正在等待资源]endl;//Sleep(5000);////////////////////////////////////////////////////////////////////////////////////////////sleep()if(waitSemapore==1){wait=next;//////////thisreaderiswaiting,locateit.waitSemapore--;}}}else//writer{if(empty==1){writer();//调用写者函数type=2;}else{cout[写者此时正在等待资源]endl;//Sleep(5000);/////////////////////////////////////////////////////////////////////////////////////////////sleep()if(waitSemapore==1)///////////thiswriteriswaiting,findit'slocation.{wait=next;waitSemapore--;}}}//writerisendnext++;}//1while()if(type==1){cout~读者readc读完毕,释放资源endl;readc++;empty++;//读者用的,但是为了在输出时演示出运行状态,不得不将其放在此处Sleep(3000);/////////////////////////////////////////////////////////////////////////////////////////////sleep()coutendl;}elseif(type==2){cout~写者writc写完毕,释放资源endl;writc++;wrIn++;//V操作改变信号量,写者用,但是为了在输出时演示出运行状态,不得不将其放在此处empty++;//V操作改变信号量,写者用,但是为了在输出时演示出运行状态,不得不将其放在此处Sleep(3000);/////////////////////////////////////////////////////////////////////////////////////////////sleep()coutendl;}}//2while()return0;}/////////////////////////////////////////////////////主函数结束
三七文档所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
本文标题:读者-写者问题C++源代码
链接地址:https://www.777doc.com/doc-4308627 .html