独木桥
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
假定有如下独木桥问题:过桥时,同一方向的行人可连续过桥,当某一方有人过桥时,另一方向的行人必须等待;当某一方向无人过桥时,另一方向的行人可以过桥。
试用信号量机制解决。
(1)需要设置几个信号量?分别是互斥信号量还是同步信号量?初值设为多少?并说明设置它们的意义。
(2)写出用信号量机制解决此问题的算法。
答案:
(1) 将独木桥的两个方向分别标记为A和B。
用整型变量countA和countB分别表示A、B方向上已在独木桥上的行人数。
初值为0。
需要设置三个初值都为1的互斥信号量:SA用来实现对countA的互斥访问,SB 用来实现对countB的互斥访问,mutex用来实现对独木桥的互斥使用。
(2)
A方向行人过桥:
Begin
P(SA);
countA=countA+1;
if (countA= =1)
P(mutex);
V(SA);
过桥;
P(SA);
countA=countA-1;
if(countA= =0)
V(mutex);
V(SA);
End
B方向行人过桥:
Begin
P(SB);
countB=countB+1;
if (countB= =1)
P(mutex);
V(SB);
过桥;
P(SB);
countB=countB-1;
if(countB= =0)
V(mutex);
V(SB);
End
用多线程同步方法解决睡眠理发师问题(Sleeping-Barber Problem)
目的:通过研究Linux的线程机制和信号量实现睡眠理发师问题(Sleeping-Barber Problem)的并发控制。
说明:设有一个理发师,5把椅子(另外还有一把理发椅),几把椅子可用连续存储单元。
要求;
(1) 每个顾客进入理发室后,即时显示“Entered” 及其线程标识,还同时显示理发室共有几名顾客及其所坐的位置。
(2) 至少有10个顾客,每人理发至少3秒钟。
(3) 多个顾客须共享操作函数代码。
问题分析
题目中要求描述理发师和顾客的行为,因此需要两类进程Barber ()和Customer()分别描述理发师和顾客的行为。
当理发师看报时顾客近来需要唤醒理发师为其理发,当有顾客时理发师为其理发,没有的时候理发师看报,因此理发师和顾客之间是同步的关系,由于每次理发师只能为一个人理发,且可供等侯的椅子有限只有n个,即理发师和椅子是临界资源,所以顾客之间是互斥的关系。
故引入3个信号量和一个控制变量:1)控制变量waiting用来记录等候理发的顾客数,初值均为0;2)信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;3)信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为0;4)信号量mutex用于互斥,初值为1
问题实现
1.PV操作代码如下:
int waiting=0 ;//等候理发的顾客数
int chairs=n;//为顾客准备的椅子数
semaphore customers=0, barbers=0,mutex=1;
barber()
{
while(TRUE); //理完一人,还有顾客吗?
P(cutomers); //若无顾客,理发师睡眠
P(mutex); //进程互斥
waiting := waiting – 1; //等候顾客数少一个
V(barbers); //理发师去为一个顾客理发
V(mutex); //开放临界区
cut-hair( ); //正在理发}
customer()
{
P(mutex); //进程互斥
if (waiting)
{ waiting := waiting+1; // 等候顾客数加1
V(customers); //必要的话唤醒理发师
V(mutex); //开放临界区
P(barbers); //无理发师, 顾客坐着养神
get-haircut( ); //一个顾客坐下等理/ }
else
V(mutex); //人满了,走吧!}。