和尚取水问题
某寺庙,有小和尚、老和尚若干。有一水缸,由小和尚用水桶从井中提水入缸,老和尚用水桶从缸里取水饮用。水缸可容30桶水,水取自同一井中。水井径窄,每次只能容一个水桶取水。水桶总数为5个。每次入、取缸水仅为1桶,且不可以同时进行。试用P、V操作给出小和尚、老和尚动作的算法描述。
题目解析
- n个小和尚从井里面提水进程之间互斥,用 mutex1 来表示;
- n个小和尚将水倒在缸里、n个老和尚从缸里面取水,这些进程互斥,用 mutex2 来表示;
- 不管是谁要使用水桶都要确认空闲水桶的数量,用 amount 来表示;
- 用 full 来表示水缸里面有几桶水,用 empty 来表示水缸里面还能放几桶水;
代码
semaphore mutex1=1,mutex2=1;
semaphore amount=5,empty=30,full=0;
void yong monk i(i=1,2,3,,,n) ()
{
while(TRUE)
{
P(empty);
p(amount);
P(mutex1);
从井里打水;
V(mutex1);
P(mutex2);
往缸里面倒水;
V(mutex2);
V(amount);
V(full);
}
}
void old monk i(i=1,2,3,,,n) ()
{
while(TRUE)
{
P(full);
P(amount);
P(mutex2);
从缸里面取水使用;
V(mutex2);
V(amount);
V(empty);
}
}
void mian()
{
cobegin
young monk i(i=1,2,3,,,n) ();
old monk i(i=1,2,3,,,n) ();
coend
}