博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
同步互斥——理发师睡觉问题
阅读量:4510 次
发布时间:2019-06-08

本文共 1043 字,大约阅读时间需要 3 分钟。

问题描述

理发店有一位理发师,一把理发椅和N把供等候的顾客坐的椅子。

如果没有顾客,理发师在理发椅上睡觉;
当有一个顾客到来时,他必须先唤醒理发师;
如果顾客来时理发师正在理发,如果有空椅子,坐下等待,否则离开。
用P,V操作解决上述问题中的同步和互斥关系。

分析

将顾客看作N个生产者,理发师是1个消费者。

理发师和椅子是临界资源,故顾客间是互斥关系;
理发师和顾客是同步关系。

信号量设置

Semaphore barberReady = 0  互斥量,只能取0或1  Semaphore accessSeat = 1  互斥量,如果为1,表明椅子数可以增加或减少,相当于给椅子加锁,避免两个顾客同时坐一把椅子Semaphore num_wait = 0   坐在椅子上等待的顾客数int seat_free    空着的椅子数目

参考()

解答

/*顾客进程*/void customer(){       while(true)    {        P(accessSeat);  //试图坐下        if(seat_free > 0)        {            seat_free--;  //坐下            V(num_wait);  //试图唤醒理发师,            V(accessSeat);  //不用再锁着椅子            P(baberReady); //等待理发师ready            理发;        }        else        {            V(accessSeat);  //释放加在椅子上的锁            离开;        }    }}/*理发师进程*/void barber(){    while(true)    {        P(num_wait);   //尝试获得一位顾客,如果没有,去睡觉        P(accessSeat);   //尝试获得椅子锁,更改空闲椅子数目        seat_free++;    //空椅子加1        V(baberReady);    //理发师准备好了        V(accessSeat);    //无需继续锁着椅子        理发;    }}

转载于:https://www.cnblogs.com/EIMadrigal/p/9248212.html

你可能感兴趣的文章
[Leetcode] The Skyline Problem
查看>>
okhttp异步请求流程和源码分析
查看>>
【集合框架】JDK1.8源码分析之Comparable && Comparator(九)
查看>>
Flutter之内置动画(转)
查看>>
uni-app中onLoad不起作用
查看>>
多线程概述
查看>>
Linux_ubuntu命令-用户、权限管理
查看>>
Knowladge_网站学习_RSS 学习
查看>>
TCP/IP,Web世界的基本规则
查看>>
c++ 子类构造函数初始化及父类构造初始化
查看>>
Analysis on Human Various Emotional Expression
查看>>
DataGridView DataGridViewCheckBoxColumn编辑时实时触发事件
查看>>
SignalR---服务端
查看>>
PlayerPrefs存储Vector3等结构数据
查看>>
LightOJ - 1422 Halloween Costumes (区间DP)
查看>>
Dubbo架构设计详解
查看>>
谁终将点燃闪电,必长久如云漂泊
查看>>
小诗句集萃四
查看>>
软件之美: 易用性设计的目标及准则
查看>>
异步回调,事件,线程池与协程
查看>>