标签:进程同步 s3 s2 s1 counter 信号量 互斥 mutex &&
1..理解生产者和消费者问题
没有引入信号量时的生产者和消费者进程,什么情况下会出现结果不唯一?什么情况下会出现永远等待?
用信号解决生产者和消费者的同步与互斥,要求能自己写出来。
答:生产者进程和消费者进程对counter的交替操作会使其结果不唯一。
生产者进程和消费者进程的交替执行会导致进程永远等待,造成系统死锁。
Int k;
Typedef anyitem item;
Item buffer[k];
Int in=0,out=,counter=0;
Process producer(void){
While(true){
{produce an item in nextp};
If(counter==k)
Sleep(producer);
Buffer[in]=nextp;
In-(in+)%k;
Counter++;
If(counter==1)
Wakeup(consumer);
}
}
Process consumer(void){
While(true){
If(counter==0)
Sleep(consumer);
Nextc=buffer[out];
Out=(out+1)%k;
Counter__;
If(counter==k-1)
Wakeup(producer);
{consume the item in nextc};
}
}
5.在一间酒吧里有三个音乐爱好者队列,第一队的音乐爱好者只有随身听,第二队只有音乐磁带,第三队只有电池。而要听音乐就必须随身听、音乐磁带和电池这三种物品俱全。酒吧老板一次出售这三种物品中的任意两种。当一名音乐爱好者得到这三种物品并听完一首乐曲后,酒吧老板才能再一次出售这三种物品中的任意两种。于是第二名音乐爱好者得到这三种物品,并开始听乐曲。全部买卖就这样进行下去。试用P,v操作正确解决这一买卖。
semaphore mutex=1,s1=0,s2=0,s3=0;
cobegin
fan1(){
s1=1;
P(s2);
P(s3);
if(s1&&s2&&s3){
V(mutex);
V(s1);
V(s2);
V(s3);
}
}
fan2(){
s2=1;
P(s1);
P(s3);
if(s1&&s2&&s3){
V(mutex);
V(s1);
V(s2);
V(s3);}
}
fan3(){
s3=1;
P(s1);
P(s2);
if(s1&&s2&&s3){
V(mutex);
V(s1);
V(s2);
V(s3);}
}
}
Coend
6.某银行有人民币储蓄业务,由n个储蓄员负责。每个顾客进入银行后先取一个号,并且等着叫号。当一个储蓄人员空闲下来,就叫下一个号。请用P,V操作正确编写储蓄人员和顾客进程的程序。
semaphore customers=0,mutex=n,check=0;
int waiting=0;
cobegin
process check(){
while(true)
{
P(customers);
P(mutex);
waiting--;
V(check);
V(mutex);
}
}
process customer_i() {
P(mutex);
waiting++;
V(customers);
V(mutex);
P(clerk):
get_service();
}
coend
标签:进程同步,s3,s2,s1,counter,信号量,互斥,mutex,&& 来源: https://www.cnblogs.com/zjxqq/p/10816795.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。