小和尚老和尚取水问题
semaphore mutexJing = 1; // 井的锁
semaphore full=0, empty=10; // 缸中满、空的位置数
semaphore mutexGang = 1; // 缸的锁
// semaphore mutexTong = 1; // 桶的锁 // 可以不用桶的锁了 // 其实不注释也行,用上这个锁更严谨
semaphore count = 3; // 桶的数量
void Lao() // 喝水老和尚进程
{
while(true)
{
wait(full); // 有盛有水的缸的位置
wait(count); // !!!!取水也需要用桶!!!
wait(mutexGang);
Get Water from Gang;
signal(mutexGang);
signal(count); // !!!!取水也需要用桶!!!
signal(empty);
Enjoy the Water;
}
}
void Xiao() // 打水小和尚进程
{
while(true)
{
wait(count); // 等桶的数量非空
// 主要是他没说取桶的地方比较小,一次只能容纳一个人
// wait(mutexTong); // wait count就够了
Get one Tong;
// signal(mutexTong); // 就不用了
wait(mutexJing);
Get Water into the Tong;
signal(mutexJing);
wait(empty); // 等缸中有空位的时候
wait(mutexGang);
Pull Water into the Gang;
signal(mutexGang);
signal(full);
// wait(mutexTong); // 不用这么详细了,反正手中有桶就一定有地儿放,直接放就好了
Return the Tong;
signal(count);
}
}
void main()
{
cobegin
Lao();
Xiao();
coend
}