吸烟者问题
假设一个系统中有3个抽烟者进程,还有一个供应者进程。每个烟民不停地卷烟并抽掉它,但是一支香烟要烟民自己组装,分别需要三种材料:烟草、纸、胶水。第1个烟民自备烟草,第2个烟民自备纸,第3个烟民自备胶水。供应者供应烟民需要的其他2种材料,烟民抽完后会通知供应者他抽完了,然后供应者就会继续提供。这个过程一直重复,我们要实现让3个烟民轮流抽烟
semaphore offer1 = 0;//烟草+纸
semaphore offer2 = 0;//烟草+胶水
semaphore offer3 = 0;//纸+胶水
semaphore finish = 0;
semaphore mutex = 1;
int i = 0;
provider(){
while(1){
P(mutex);
if(i==0)
V(offer3);
if(i==1)
V(offer2);
if(i==2)
V(offer1);
i = (i+1) % 3;
V(mutex);
P(finish);
}
}
smoker1(){
P(offer3);
P(mutex);
抽烟
V(mutex);
V(finish);
}
smoker2(){
P(offer2);
P(mutex);
抽烟
V(mutex);
V(finish);
}
smoker3(){
P(offer1);
P(mutex);
抽烟
V(mutex);
V(finish);
}
互斥信号量是桌子,缓冲区是1个的情况下,任何时刻下,offer1 offer2 offer3同步信号量最多只有一个是1(如果有多个进程是1,说明出现了2个进程同时访问缓冲区,有可能导致数据相互覆盖),因此最多只有1个不会被阻塞,所以可以不用写互斥信号量,但是写了也没错