录像厅问题
假设一个录像厅有0,1,2三种不同的录像片可由观众选择放映。录像厅的放映规则为:
1)任何时刻最多只能放映一种录像片,正在放映的录像片是自动循环放映的。最后一个观众主动离开时结束当前录像片的放映。
2)选择当前正在放映录像片的观众可立即进入,允许同时有多位选择同一中录像片的观众同时观看,同时观看的观众数量不受限制。
3)等待观看其他录像片的观众按到达顺序排队,当一种新的录像片开始放映时,所有等待观看该录像片的观众可一次进入录像厅同时观看。
问题分析
临界资源:录像厅
- 对三种不同的观众来说,使用录像厅是互斥的,用mutex来表示;
- 对于每一种不同的观众观影时,我们需要知道该类观众的人数,用count0、count1、count2来表示;
- 为了保证计数变量的操作之间是互斥的,用mutex0、mutex1、mutex2分别表示count0、count1、count2的互斥使用
代码
semaphore mutex=1,mutex0=1,mutex1=1,mutex2=1;
int count0=0,count1=0,count2=0;
void zero()
{
P(mutex0);
if(count0=0) P(mutex);
count0++;
V(mutex0);
观影;
P(mutex0);
count0--;
if(count0=0) V(mutex);
V(mutex0);
}
void one()
{
P(mutex1);
if(count1=0) P(mutex);
count1++;
V(mutex1);
观影;
P(mutex1);
count1--;
if(count1=0) V(mutex);
V(mutex1);
}
void two()
{
P(mutex2);
if(count2=0) P(mutex);
count2++;
V(mutex2);
观影;
P(mutex2);
count2--;
if(coun2=0) V(mutex);
V(mutex2);
}
void main()
{
cobegin
zero();one();two();
coend
}