和尚挑水

深挖个人价值:利用业余时间提升技能
    有两个和尚他们分别住在相邻的两座山上的庙里。这两座山之间有一条溪,于是这两个和尚每天都会在同一时间下山去溪边挑水,久而久之他么变成为了好朋友。就这样时间在每天挑水中不知不觉已经过了五年。突然有一天左边这座山的和尚没有下山挑水,右边那座山的和尚心想:"他大概睡过头了。"便不以为意。哪知道第二天左边这座山的和尚还是没有下山挑水,第三天也一样。过了一个星期还是一样,直到过了一个月右边那座山的和尚终于受不了,他心想:"我的朋友可能生病了,我要过去拜访他,看看能帮上什么忙。"于是他便爬上了左边这座山,去探望他的老朋友。等他到了左边这座山的庙,看到他的老友之后大吃一惊,因为他的老友正在庙前打太极拳,一点也不像一个月没喝水的人。他很好奇地问:"你已经一个月没有下山挑水了,难道你可以不用喝水吗?"左边这座山的和尚说:"来来来,我带你去看。"于是他带着右边那座山的和尚走到庙的后院,指着一口井说:"这五年来,我每天做完功课后都会抽空挖这口井,即使有时很忙,能挖多少就算多少。如今终于让我挖出井水,我就不用再下山挑水,我可以有更多时间练我喜欢的太极拳。"-

    启示:我们在公司领的薪水再多,那都是挑水。而把握下班后的时间挖一口属于自己的井,培养自己另一方面的实力,未来当我们年纪大了,体力拼不过年轻人了,依然还是有水喝,而且还能喝得很悠闲。-
### 使用信号量解决三个和尚挑水的多线程同步问题 为了确保三个和尚能够安全地完成取水过程而不发生冲突,可以利用信号量机制来管理资源访问。以下是具体的解决方案: #### 设计思路 定义两个信号量 `empty` 和 `full` 来控制桶的状态以及一个互斥锁 `mutex` 保护共享变量的操作。 - `empty`: 表示空桶的数量,初始值设为1(只有一个桶) - `full`: 表示满桶的数量,初始值设为0 - `mutex`: 用来保证对全局变量的安全修改 #### 伪代码实现 ```c #include <pthread.h> #include <semaphore.h> // 定义信号量和互斥锁 sem_t empty; sem_t full; pthread_mutex_t mutex; int water_bucket = 0; // 水桶中的水量, 初始为空 void *monk_thread(void *arg) { while (true) { sem_wait(&empty); // P(empty): 如果没有空桶,则等待 pthread_mutex_lock(&mutex);// 加锁 printf("Monk %d is filling the bucket\n", *(int *)arg); water_bucket++; // 增加水桶里的水量 sleep(1); // 模拟填水时间 pthread_mutex_unlock(&mutex); // 解锁 sem_post(&full); // V(full): 放置了一个满桶 } } void *drink_thread(void *arg) { while (true) { sem_wait(&full); // P(full): 若无满桶则等待 pthread_mutex_lock(&mutex);// 加锁 printf("Drinking from the bucket...\n"); water_bucket--; // 减少水桶里的水量 sleep(2); // 模拟喝水的时间 pthread_mutex_unlock(&mutex); // 解锁 sem_post(&empty); // V(empty): 清空后的桶又可用作空桶 } } ``` 此程序创建了两类线程——僧侣线程负责往水桶里添水[^1];饮水线程模拟喝水行为并清空水桶[^2]。通过这种方式实现了多个线程之间的协调工作,从而解决了经典的“三个和尚没水吃”的困境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值