欢迎来到天天文库
浏览记录
ID:14700667
大小:56.00 KB
页数:8页
时间:2018-07-30
《读者写者问题源代码》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、#include#include#include/*malloc()等*/#include/*INT_MAX等*/#include/*EOF(=^Z或F6),NULL*/#include/*atoi()*/#include/*eof()*/#include/*floor(),ceil(),abs()*/#include/*exit()*/#include#includeusingnamespa
2、cestd;#defineBUF10//缓存的大小#defineMAX20//最大可以输入的字符typedefstructPcb{charname[10];//进程名charstate[10];//运行状态charreason[10];//若阻塞,其原因intbreakp;//断点保护structPcb*next;//阻塞时的顺序}Pcb,*link;ints1,s2;//信号量linkp1;//生产者进程linkc1;//消费者进程charstr[MAX];//输入的字符串charbuffer[BUF];//缓冲池intlen;//输入长度intsp=0;//string的指针intin=
3、0;//生产者指针intout=0;//消费者指针chartemp;//供打印的临时产品charrec_p[MAX];//生产记录intrp1=0;//生产记录指针charrec_c[MAX];//消费记录intrp2=0;//消费记录指针linkready;//就绪队列linkb_s1;//s1阻塞队列linkb_s2;//s2阻塞队列intpc;//程序计数器intcount;//字符计数器intcon_cnt;//消费计数器voidinit();//初始化voidp(ints);//P操作voidv(ints);//V操作voidblock(ints);//阻塞函数voidwakeup
4、(ints);//唤醒函数voidcontrol();//处理机调度voidprocessor();//处理机执行voidprint();//打印函数voidmain(){printf("*生产者消费者模拟");printf("---------");printf("*请输入字符串:");scanf("%s",str);//string数组存放将要产生的字符len=strlen(str);count=len;//输入字符的个数init();//初始化while(con_cnt5、---模拟指令流程--------");control();//处理器调度程序processor();//模拟处理器指令执行print();//输出显示各个信息}printf("程序结束!");}voidinit(){//初始化s1=BUF;s2=0;p1=(link)malloc(sizeof(Pcb));//建立新的结点,并初始化为生产者strcpy(p1->name,"Producer");strcpy(p1->state,"Ready");strcpy(p1->reason,"Null");p1->breakp=0;p1->next=NULL;c1=(link)mallo6、c(sizeof(Pcb));//建立新的结点,并初始化为消费者strcpy(c1->name,"Consumer");strcpy(c1->state,"Ready");strcpy(c1->reason,"Null");c1->breakp=0;c1->next=NULL;ready=p1;ready->next=c1;//初始化为生产进程在前,消费进程在后c1->next=NULL;b_s1=NULL;b_s2=NULL;//阻塞进程为NULLpc=0;con_cnt=0;//消费计数器}voidp(ints){if(s==1){//p(s1)s1--;if(s1<0)block(1)7、;//阻塞当前生产进程else{printf("t*s1信号申请成功!");ready->breakp=pc;//保存断点}}else{//p(s2)s2--;if(s2<0)block(2);//阻塞当前消费进程else{printf("t*s2信号申请成功!");ready->breakp=pc;//保存断点}}}voidv(ints){if(s==1){//v(s1)s1++;if(s1<=
5、---模拟指令流程--------");control();//处理器调度程序processor();//模拟处理器指令执行print();//输出显示各个信息}printf("程序结束!");}voidinit(){//初始化s1=BUF;s2=0;p1=(link)malloc(sizeof(Pcb));//建立新的结点,并初始化为生产者strcpy(p1->name,"Producer");strcpy(p1->state,"Ready");strcpy(p1->reason,"Null");p1->breakp=0;p1->next=NULL;c1=(link)mallo
6、c(sizeof(Pcb));//建立新的结点,并初始化为消费者strcpy(c1->name,"Consumer");strcpy(c1->state,"Ready");strcpy(c1->reason,"Null");c1->breakp=0;c1->next=NULL;ready=p1;ready->next=c1;//初始化为生产进程在前,消费进程在后c1->next=NULL;b_s1=NULL;b_s2=NULL;//阻塞进程为NULLpc=0;con_cnt=0;//消费计数器}voidp(ints){if(s==1){//p(s1)s1--;if(s1<0)block(1)
7、;//阻塞当前生产进程else{printf("t*s1信号申请成功!");ready->breakp=pc;//保存断点}}else{//p(s2)s2--;if(s2<0)block(2);//阻塞当前消费进程else{printf("t*s2信号申请成功!");ready->breakp=pc;//保存断点}}}voidv(ints){if(s==1){//v(s1)s1++;if(s1<=
此文档下载收益归作者所有