和尚提水问题:P(wait)V(signal)同步设计
和尚提水问题:P(wait)V(signal)同步设计
某寺庙,有小和尚、老和尚若干。庙内有一水缸,由小和尚用水桶从井中提水入缸,老和尚用水桶从缸里取水饮用。水缸可容10桶水,水取自同一井中。水井径窄,每次只能容一个水桶取水。水桶总数为3个。每次入、取缸水仅为1桶,且不可以同时进行。试用P(wait)V(signal)操作实现老和尚和小和尚的活动,请给出同步设计的理由和相应的伪代码。
同步设计的理由:
- 确保小和尚和老和尚不会同时进行水桶的入、取操作,避免多个线程同时访问共享资源导致数据不一致的问题。
- 确保当水缸已满或已空时,小和尚和老和尚能够及时得到通知,不需要无限等待或浪费资源地进行操作。
伪代码:
定义信号量 s1, s2, s3, mutex 初始化 s1 = 0, s2 = 0, s3 = 10, mutex = 1
小和尚进入:
wait(mutex) // 等待访问水缸
if s3 > 0 // 如果水缸还有空余
signal(s1) // 通知老和尚可以取水
wait(s2) // 等待老和尚取走一桶水
s3-- // 将水桶中的水加入缸中
signal(mutex) // 放弃对水缸的访问
老和尚进入:
wait(mutex) // 等待访问水缸
if s3 < 10 // 如果水缸还有水
signal(s2) // 通知小和尚可以加水
wait(s1) // 等待小和尚加了一桶水
s3++ // 将水缸中的水加入水桶中
signal(mutex) // 放弃对水缸的访问
初始状态:s1=0,s2=0,s3=10,mutex=1
小和尚调用:小和尚进入()
老和尚调用:老和尚进入()
原文地址: https://www.cveoy.top/t/topic/owaI 著作权归作者所有。请勿转载和采集!