8.5 经典进程同步问题-吸烟者问题

问题描述

假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者需要有三种材料:烟草、纸和胶水,才可吸烟。三个抽烟者分别拥有三种材料中的一种。 供应者每次随机将两种材料放到桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它。材料被使用后,供应者按上述原则继续提供材料。

问题分析

  1. 关系分析。供应者与三个抽烟者分别是同步关系。由于供应者无法同时满足两个或 以上的抽烟者,三个抽烟者对抽烟这个动作互斥。

  2. 整理思路。这里有四个进程。供应者作为生产者向三个抽烟者提供材料。

  3. 信号量设置。信号量offer1、offer2、offer3分别表示烟草和纸组合的资源、烟草和 胶水组合的资源、纸和胶水组合的资源。信号量finish用于互斥进行抽烟动作。

解决方案

注意:finish初始值为0,表示无人抽烟,当供应者材料抽烟后,材料使用完毕,会调用V(finish),将finish加1。供应者接到此通知后,继续随机提供材料。代码如下:

int random; //存储随机数
semaphore offer1=0; //定义信号量对应烟草和纸组合的资源
semaphore offer2=0; //定义信号量对应烟草和胶水组合的资源
semaphore offer3=0; //定义信号量对应纸和胶水组合的资源
semaphore finish=0; //定义信号量表示抽烟是否完成

//供应者
while(1){
    random = 任意一个整数随机数;
    random=random% 3;
    if(random==0)
        V(offerl) ; //提供烟草和纸
    else if(random==l) 
        V(offer2);  //提供烟草和胶水
    else
        V(offer3)  //提供纸和胶水
    // 任意两种材料放在桌子上,并等待抽烟者抽烟后将finish设置为1
    P(finish);//抽烟者已经使用完材料,需要继续提供材料
}

//拥有烟草者
while(1){
    P (offer3);
    // 拿纸和胶水,卷成烟,抽掉;
    V(finish);
}

//拥有纸者
while(1){
    P(offer2);
    // 烟草和胶水,卷成烟,抽掉;
    V(finish);
}

//拥有胶水者
while(1){
    P(offer1);
    // 拿烟草和纸,卷成烟,抽掉;
    v(finish);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 问题描述 有读者和写者两组并发进程,共享一个文件,当两个或以上的读进程同时访问共享数据时不会产生副作用,但若某个写...
    saviochen阅读 6,785评论 0 6
  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 9,652评论 0 23
  • 本文摘自汤小丹主编《计算机操作系统》(第三版)2.4 经典进程的同步问 在多道程序环境下,进程同步问题十分重要,也...
    刘帅_阅读 10,161评论 1 1
  • 我在哪 我还在原地 回头看一眼 迷迭香在风中摇曳 你在哪 你正在远方 背着一囊星光 看月色引领着前方 他在哪 你我...
    双雨阅读 1,486评论 0 2
  • 那天,丈夫说想吃蘑菇 我便购了些来 孩子在屋外玩耍 小狗在快乐的奔跑 天空很晴朗 我认真的整理蘑菇 一朵又一朵 我...
    老慕慕阅读 1,765评论 0 1

友情链接更多精彩内容