盘一盘吸烟者问题
1.问题描述
一个烟草制造商,三个烟民。每个烟民抽的烟草款式不同,制造商需要根据所有制作香烟放到板凳子上。
2.出现的问题&应用场景
问题:轮流的为三个烟民提供各自相应的香烟
场景:生产者需要生产不同的产品
3.解决方案
申明信号量
semaphore xiangyan1 = 0; // 香烟1
semaphore xiangyan2 = 0; // 香烟2
semaphore xiangyan3 = 0; // 香烟3
semaphore finish = 0; // 是否抽完烟
int i = 0; // 用于控制轮流吸烟
烟草提供商
provider(){
while(1){
if(i == 0){
香烟1放凳子上;
V(xiangyan1);
}else if(i == 0){
香烟2放到凳子上;
V(xiangyan2);
}else{
香烟3放到凳子上
V(xiangyan3);
}
i = (i + 1) % 3;
P(finish);
}
}
烟民1号
smoker1(){
while(1){
P(xiangyan1);
拿走香烟1,抽完它
V(finish);
}
}
烟民2号
smoker2(){
while(2){
P(xiangyan2);
拿走香烟2,抽完它
V(finish);
}
}
烟民3号
smoker3(){
while(3){
P(xiangyan1);
拿走香烟3,抽完它
V(finish);
}
}
通过xinagyan1,2,3这三个信号量实现(先生产了再抽)同步问题
finish解决了(抽完了再继续造烟)的同步问题