信号量解决男女共浴问题

任务要求:

男女共浴(或过桥问题)(引自 AST《现代操作系统》 3th, P98)。
1. 假设一个大学为了卖弄其政治上的正确性,准备把美国最高法院的信条“平等但隔
离其本身就是不平等”既运用在种族上也运用在性别上,从而结束校园内长期使用
的浴室按性别隔离的做法。但是,为了迁就传统习惯,学校颁布法令:当有一个女
生在浴室里,那么其他女生可以进入,但是男生不行,反之亦然。在每个浴室的门
上有一个滑动指示符号,表示当前处于以下三种可能状态之一:
 空
 有女生
 有男生 
用你偏好的程序设计语言编写下面过程(可以随意采用所希望的计数器和同步技
术):
woman_wants_to_enter
man_wants_to_enter
woman_leaves
man_leaves 


思路:类似于读者-写者问题,只不过变成了多写者情况。根据题目提供的信息,很容易得出三个信号量,这三个信号量分别为mutex(性别互斥锁),mutex_man(对男士的操作互斥锁),mutex_woman(对女士的操作互斥锁)。另外,加入计数变量count防止死锁。


void woman_wants_to_enter(void){
    down(&mutex);
    count = count+1;
    wc = wc+1;           //女生计数器
    if(count == 1 && wc == 1) down(&mutex_man);  //女生抢占锁
    up(&mutex);
    down(&mutex_woman);     //这两行对女生是否抢占锁进行检测,up防止只能进入一个女生
    up(&mutex_woman);
    woman_enter();
}

void woman_leaves(void){
    down(&mutex);
    wc = wc-1;
    if(wc == 0) {
        up(&mutex_man);
        if(mc != 0) {
            count = -1;    //防止女生抢占锁
            down(&mutex_woman); 
        }
    }  //如果最后一个女生洗浴完成,释放男生锁,并且检查是否有男生在等待使用,如果有,阻止女生进入
    up(&mutex);
}

void man_wants_to_enter(void){
    down(&mutex);
    count = count-1;
    mc = mc+1;
    if(count == -1 && mc == 1) down(&mutex_woman);    //若count为-1说明男生比女生多,所以如果存在女生和男生竞争锁且count为-1时mc至少为2
    up(&mutex);
    down(&mutex_man);
    man_enter();
}

void man_leaves(void){
    down(&mutex);
    mc = mc-1;
    if(mc == 0) {
        up(&mutex_woman);
        if(wc != 0) {
            count = 1;   
            down(&mutex_man); 
        }
    }  
    up(&mutex);
}

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
洗浴管理系统是一个用于管理洗浴中心的系统,它可以帮助管理者更好地组织和监控洗浴中心的各项业务。下面是洗浴管理系统的UML用例图的介绍: 1. 顾客管理:该用例述了对顾客信息进行管理的功能。包括添加顾客、修改顾客信息、查询顾客信息等操作。 2. 员工管理:该用例述了对员工信息进行管理的功能。包括添加员工、修改员工信息、查询员工信息等操作。 3. 预约管理:该用例述了对顾客预约洗浴服务进行管理的功能。包括添加预约、修改预约、取消预约等操作。 4. 洗浴服务管理:该用例述了对洗浴服务进行管理的功能。包括添加洗浴服务、修改洗浴服务、删除洗浴服务等操作。 5. 收银管理:该用例述了对顾客消费进行管理的功能。包括结账、打印发票、查询消费记录等操作。 6. 库存管理:该用例述了对洗浴用品库存进行管理的功能。包括添加库存、修改库存、查询库存等操作。 7. 报表统计:该用例述了对洗浴中心业务数据进行统计和分析的功能。包括生成营业报表、查看业务数据分析等操作。 8. 系统管理:该用例述了对洗浴管理系统进行管理的功能。包括系统设置、用户权限管理、日志查看等操作。 以上是洗浴管理系统UML用例图的主要内容,它展示了系统的各项功能和用户之间的交互。如果您有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值