问答题
某寺庙,有小和尚和老和尚若干,有一个水缸,由小和尚提水入缸供老和尚饮用。水缸可以容纳10桶水,水取自同一口井中,由于水井口窄,每次只能容纳一个水桶取水。水桶总数为3个(老和尚和小和尚共同使用)。每次入水、取水仅为一桶,且不可同时进行。试给出有关取水、入水的算法描述。
【正确答案】本题需要设置5个信号量:
semaphore empty=10; //表示缸中目前还能装多少桶水,初始时能装10桶水
semaphore full=0; //表示缸中有多少桶水,初始时缸中没有水
semaphore buckets=3; //表示有多少个空桶可用,初始时有3个桶可用
semaphore mutex_well=1; //用于实现对井的互斥操作
semaphore mutex_bigjar=1; //用于实现对缸的互斥操作
young_monk(){ //小和尚入水算法
While(true){
P(empty);
P(bucketS);
去井边;
P(mutex_well);
取水;
V(mutex_well);
回寺庙;
P(mutex_bigjar);
pure the water into the big jar;
V(mutex_bigjar);
V(buckets);
V(full);
}
}
old_monk(){ //老和尚取水算法
While(true){
P(full);
P(buckets);
P(mutex_bigjar);
取水;
V(mutex_bigjar);
喝水;
V(buckets);
V(empty);
}
}
【答案解析】