“吸烟者”问题
问题描述
存在三个抽烟者和一个供应者。
每个抽烟者不停地卷烟并抽烟,烟有三种原材料:烟草、烟纸、胶水。
三个抽烟者中,第一个拥有烟草,第二个拥有烟纸,第三个拥有胶水。
供应者不断地随机供应这三种原材料,每次提供两种原材料到桌子上,能卷好烟的抽烟者会卷烟并抽烟,结束后供应者继续提供新的原材料……
问题分析
关系分析
形成的是一个三人轮流抽烟的情况,由于限制了必须能卷好烟的人才能拿走材料,所以避免了死锁。
供应者与三个抽烟者之间分别是同步的关系。
三个抽烟者对抽烟这个动作是互斥的。
求解思路
设置四个进程,一个供应者,三个不同的抽烟者。
信号量设置
需要4个信号量:
- offer1:对应烟草和纸组合的资源
- offer2:对应烟草和胶水组合的资源
- offer3:对应纸和胶水组合的资源
- finish:表示抽烟是否完成,互斥抽烟这个动作
问题解决
int random; // 存储随机数
semaphore offer1 = 0; // 定义信号量对应烟草和纸组合的资源
semaphore offer2 = 0; // 定义信号量对应烟草和胶水组合的资源
semaphore offer3 = 0; // 定义信号量对应纸和胶水组合的资源
semaphore finish = 0; // 定义信号量表示抽烟是否完成
P1() {
while(1) {
// TODO 随机化整数变量random∈[0,1,2]
if (random == 0) {
V(offer1); // 提供烟草和纸
} else if (random == 1) {
V(offer2); // 提供烟草和胶水
} else {
V(offer3); // 提供纸和胶水
}
// TODO 任意两种材料放到桌子上
P(finish);
}
}
P2() {
while(1) {
P(offer3);
// TODO 拿纸和胶水,卷成烟,抽掉
V(finish);
}
}
P3() {
while(1) {
P(offer2);
// TODO 拿烟草和胶水,卷成烟,抽掉
V(finish);
}
}
P4() {
while(1) {
P(offer1);
// TODO 拿烟草和纸,卷成烟,抽掉
V(finish);
}
}