当前位置:首页 > 模拟PV操作同步机构,且用PV操作解决生产者 - 消费者问题
}
if(s==1){ //p(s1) }
else{ //p(s2) }
s2--; if(s2<0)
block(2);//阻塞当前消费进程 s1--; if(s1<0)
block(1); //阻塞当前生产进程
else{ }
printf(\信号申请成功!\\n\ready->breakp=pc; //保存断点
else{ }
printf(\信号申请成功!\\n\ready->breakp=pc; //保存断点
void v(int s){
if(s==1){ //v(s1) }
else{ //v(s2)
s2++; if(s2<=0) s1++; if(s1<=0)
wakeup(1); //唤醒生产进程
ready->breakp=pc; //保存断点
}
}
wakeup(2);//唤醒消费进程
ready->breakp=pc; //保存断点
void block(int s){//阻塞函数的定义
link p; int num1=0; int num2=0;
if(s==1){//生产进程 }
else{//消费进程
strcpy(c1->state,\strcpy(c1->reason,\
strcpy(p1->state,\改变状态 strcpy(p1->reason,\说明原因 p=b_s1; while(p){ }
if(!b_s1)
b_s1=p1; num1++;
p=p->next;//p的值为NULL,表示队尾
else
p=p1;
p1->next=NULL;
printf(\生产进程阻塞了!\\n\ready->breakp=pc; //保存断点
ready=ready->next;//在就绪队列中去掉,指向下一个 num1++;
}
p=b_s2; while(p){
num2++;
p=p->next;//p的值为NULL,表示队尾
} if(!b_s2)
b_s2=c1;
else
p=c1;
ready->breakp=pc; //保存断点
ready=ready->next;//在就绪队列中去掉,指向下一个 c1->next=NULL;
printf(\消费进程阻塞了!\\n\num2++;
}
printf(\阻塞的生产进程个数为:%d\\n\ printf(\阻塞的消费进程个数为:%d\\n\
void wakeup(int s){//唤醒函数的定义
link p; link q=ready;
if(s==1){ //唤醒b_s1队首进程,生产进程队列
p=b_s1;
b_s1=b_s1->next;//阻塞指针指向下一个阻塞进程 strcpy(p->state,\strcpy(p->reason,\while(q)//插入就绪队列
q=q->next;
q=p;
}
}
p->next=NULL;
printf(\生产进程唤醒了!\\n\
else{ //唤醒b_s2队首进程,消费进程队列 }
p=b_s2;
b_s2=b_s2->next;//阻塞指针指向下一个阻塞进程 strcpy(p->state,\strcpy(p->reason,\while(q->next)//插入就绪队列
q=q->next;
q->next=p; p->next=NULL;
printf(\消费进程唤醒了!\\n\
void control() //处理器调度程序 {
link p=ready; int rd; int num=0;
if(ready==NULL) //若无就绪进程,结束
while(p) //统计就绪进程个数 {
num++;
p=p->next;//最终p变为NULL
return;
}
共分享92篇相关文档