1. 推广例子中的消息缓冲问题。 消息缓冲区为k个,有1个发送进程, n个接收进程,每个接收进程对发送来的消息都必须取一次 若有m个发送进程呢? Send: SB=k; //信号量,标记当前空余缓冲区资源。 i = 0; //标记存放消息的缓冲区位置while (true) { P(SB); 往Buffer [i]放消息; V(SM); i = (i+1) % k; }; Receive: j = 0; //标记取产品的缓存区位置 SM=0;//信号量,标记初始没有消息 ReadCount=0;//读进程计数器 Mutex =1; //读进程互斥信号量 SW=0; //信号量,读进程在此信号量等待 while (true) {
P(SM); 从Buffer[j]取消息; ReadCount++ If(ReadCountn){ V(SM);
讯享网
P(SW) }else{ V(SB); j = (j+1) % k; for(int g=1; g ReadCount;g++)
讯享网V(SW);
ReadCount=0; }
};
2.第二类读者写者问题: 写者优先 条件: 1)多个读者可以同时进行读 2)写者必须互斥(只允许一个写者写,也不能读者写者???时进行) 3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者) rc=0, //正在读者计数器 wc, //写计数器 rw, //读等计数器 R //等待读信号量 W //等待写信号量 读者:
讯享网 while (true) { P(mutex); if (wc 0){ rw++ P (R); } rc++; If(rw0wc=0){
V® rw–
} V(mutex); 读 P(mutex); rc --; if (rc==0){ If(wc0) V(w)
}
讯享网 V(mutex); };
写者:
while (true) { P(mutex); wc ++; if((wc 1)||(rc0)){ P(W)
}
讯享网 V(mutex);
写
P(mutex); Wc --; if(wc0) V(W); Else if(rw0) V(R)
rw–
讯享网 V(mutex); };
3.理发师睡觉问题 理发店里有一位理发师,一把理发椅和N把供等候理发的顾客坐的椅子 如果没有顾客,则理发师便在理发椅上睡觉。当一个顾客到来时,他必须先唤醒理发师

如果顾客到来时理发师正在理发,则如果有空椅子,可坐下来等;否则离开
Wait =0; 表示等待顾客资源; Barber=1;表示可以理发 custNum 关键资源,表示当前顾客数量 顾客进程:
讯享网Coming//顾客来到 P(mutex)
If(custNum0){
If(custNum=N){ V(mutex) P(wait);
}else{ V(mutex)
讯享网离开;
} }else{
V(mutex) V(Barber); 理发; 离开; P(mutex) custNum--;
V(mutex)
讯享网V(wait)
} 理发师进程:
While{ P(mutex) If(custNum ==0){ V(mutex) P (Barber) }else{ V(mutex) 理发
}
讯享网 }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/198001.html