various

小和尚老和尚取水问题

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
}