【操作系统】Semaphore处理吸烟者问题

“吸烟者”问题

问题描述

存在三个抽烟者和一个供应者。
每个抽烟者不停地卷烟并抽烟,烟有三种原材料:烟草、烟纸、胶水。
三个抽烟者中,第一个拥有烟草,第二个拥有烟纸,第三个拥有胶水。
供应者不断地随机供应这三种原材料,每次提供两种原材料到桌子上,能卷好烟的抽烟者会卷烟并抽烟,结束后供应者继续提供新的原材料……

问题分析

关系分析

形成的是一个三人轮流抽烟的情况,由于限制了必须能卷好烟的人才能拿走材料,所以避免了死锁。

供应者与三个抽烟者之间分别是同步的关系。
三个抽烟者对抽烟这个动作是互斥的。

求解思路

设置四个进程,一个供应者,三个不同的抽烟者。

信号量设置

需要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);
    }
}
上一篇:顺序容器


下一篇:问题总结