老和尚和小和尚打水问题

问题描述

某寺庙有小和尚和老和尚若干,水缸一只,由小和尚提水入缸供老和尚饮用。水缸可容水10桶,水取自同一口水井中。水井径窄,每次仅能容纳一只水桶取水,水桶共三只。每次放入、取出的水量仅为一桶,试用PV操作写出小和尚打水、放入水缸、老和尚取水喝的过程。

问题分析

明确行为对象:小和尚、老和尚

明确临界区:

水井:小和尚之间互斥

水缸:小和尚、大和尚之间互斥

水桶:小和尚、大和尚之间互斥

明确信号量:

1.n个小和尚到水井提水时互斥,用mutex1控制

2.小和尚将水放入水缸和老和尚取水互斥,用mutex2控制

3.临界区是空闲的水桶数量,老和尚和小和尚都要用,用amount控制

4.使用full来表示水缸里有几桶水,用empty来表示水缸里还能放几桶水

算法描述

semaphore mutex1=1,mutex2=1;

semaphore amount=5,empty=30,full=0;

void LittleMonk i(i=1,2,3,,,n) ()

{

while(TRUE)

{

P(empty);

p(amount);

P(mutex1);

小和尚从井里打水;

V(mutex1);

P(mutex2);

往缸里面倒水;

V(mutex2);

V(amount);

V(full);

}

}

void BigMonk i(i=1,2,3,,,n) ()

{

while(TRUE)

{

P(full);

P(amount);

P(mutex2);

从缸里面取水使用;

V(mutex2);

V(amount);

V(empty);

}

}

void mian()

{

cobegin

young monk i(i=1,2,3,,,n) ();

old monk i(i=1,2,3,,,n) ();

coend

}

代码实现

#include

#include

#include

#include

#include

#include

#define P sem_wait

#define V sem_post

#define mutex1 &muteX1

#define mutex2 &muteX2

#define amount &Amount

#define empty &Empty

#define full &Full

#define N 10

sem_t muteX1,muteX2;

sem_t Amount,Empty,Full;

int littleMonkCount= 0;

int BigMonkCount = 0;

int fullcount = 0;

int sum=50;

void* LittleMonk(void *p)

{

while(sum)

{

sum--;

P(empty); //小和尚打水先要看看水缸里是否满了,没满才能够打水,可以打水的容量-1,毕竟这位小和尚去打了

littleMonkCount++;

P(amount); //想打水可还不行,还要看看有没有打水桶可以用,抢到了水桶就可以继续打水,可用水桶-1

P(mutex1); //小和尚拿着桶到了水井,如果没有其他的小和尚在打水,这位勤快的小和尚才能打水

/** 小和尚在井边提水 **/

printf("第%d个小和尚在水井提水\n",littleMonkCount);

/** 小和尚在井边提水 **/

V(mutex1); //小和尚打完水后释放资源,以便给下一个小和尚继续打水

P(mutex2); //小和尚回到水缸旁等待倒水,如果此时没有其他小和尚倒水和大和尚取水,这位勤快的小和尚即可倒水

/** 小和尚在水缸旁提水 **/

printf("水缸已有%d桶水,第%d个小和尚在水缸旁倒水\n",fullcount,littleMonkCount);

fullcount++;

/** 小和尚在水缸旁提水 **/

V(mutex2); //小和尚倒完水后走开,以便给下一个和尚打水或提水

V(amount); //这位勤奋的小和尚完成了他的任务,放下了他的水桶,可用水桶+1

littleMonkCount--;

V(full); //多亏了这位勤快的小和尚,水缸里又多了一桶水

}

}

void* BigMonk(void *p)

{

int myFull;

while(sum)

{

sum--;

P(full); //大和尚瞧了瞧水缸里,如果有水,就去找水桶准备打水,没有则在旁边等候,这时候相当于老和尚已经预定了这桶水

BigMonkCount++;

P(amount); //大和尚看到有水了赶紧去抢水桶,抢不到又得等,抢到了接着急冲冲跑向水缸

P(mutex2); //跑到了水缸旁,看到有人有和尚在使用水缸则等待,没有和尚在使用则开始打水

/** 大和尚在水缸旁提水 **/

printf(" 水缸已有%d桶水,第%d个大和尚在水缸旁提水\n",fullcount,BigMonkCount);

fullcount--;

/** 大和尚在水缸旁提水 **/

V(mutex2); //大和尚提完水后离去,以便给下一个和尚使用水缸

V(amount); //不要忘了放水桶给下一个和尚用

BigMonkCount--;

V(empty); //可以打水的数量+1

}

}

int main()

{

int i,j;

/** 初始化资源个数 **/

sem_init(mutex1, 0, 1); //互斥锁默认为1

sem_init(mutex2,0,1); //互斥锁默认为1

sem_init(amount,0,3); //开始时有3个水桶供使用

sem_init(full,0,0); //开始时水缸里没有水,设置为0

sem_init(empty,0,10); //开始时水缸里最多能装10桶水,设置为10

/** 创建多个大和尚进程 **/

for(i=1;i<=4;i++){

pthread_t i;

pthread_create(&i, NULL,BigMonk, NULL);

}

/** 创建多个小和尚进程 **/

for(j=1;j<=10;j++){

pthread_t j;

pthread_create(&j, NULL,LittleMonk, NULL);

}

/**观察结果后关闭进程**/

getchar();

pthread_exit(0);

return 0;

}

运行结果

小和尚打水问题_老和尚和小和尚打水问题相关推荐

  1. 和尚挑水 java_java编程:山上有一口缸可以装50升水,现在有15升。老和尚叫小和尚下山挑水,每次挑5升,要挑几次...

    java编程:山上有一口缸可以装50升水,现在有15升.老和尚叫小和尚下山挑水,每次挑5升,要挑几次 关注:123  答案:6  mip版 解决时间 2021-01-17 07:16 提问者妳有我霸氣 ...

  2. 递归-----从前有座山,山里有座庙,庙里有个老和尚和小和尚说.....

    递归 就是方法定义本身调用方法本身的现象叫做递归 注意了!!注意了!!! StringBuffer.append().append().append(),这个不叫作递归,这个叫做方法的连续使用 Mat ...

  3. 操作系统:小和尚打水+老和尚喝水经典同步问题实现 菜鸟的解题全过程(附具体代码)

    操作系统刚上两周网课老师便布置了两道现阶段本人觉得是课设的"课设",第一道题在之前的博客中报告过了,下面是第2道题的菜鸟报告.上一篇博客中有初次做这道题的具体分析过程了,这里就侧重 ...

  4. 操作系统-用信号量解决小和尚打水老和尚喝水问题

    题目:某寺庙,有小和尚.老和尚若干.庙内有一水缸,由小和尚提水入缸,供老和尚饮用.水缸可容纳 30 桶水,每次入水.取水仅为1桶,不可同时进行.水取自同一井中,水井径窄,每次只能容纳一个水桶取水.设水 ...

  5. 多核多线程中小和尚老和尚取水喝水问题

    最近学习多核多线程技术,最后的考试题目是和尚的问题.题目具体如下: 某寺庙有小和尚.老和尚若干.庙内有一水缸.由小和尚提水入缸,供老和尚引用.水缸可容纳10桶水,每次入水.取水都为1桶,且不可同时进行 ...

  6. 操作系统PV操作伪代码(小和尚提水、老和尚饮水问题)

     题目: 某寺庙,有小和尚.老和尚若干.庙内有一水缸,由小和尚提水入缸,供老和尚饮用.水缸可容纳10桶水,每次入水.取水仅为1桶,不可同时进行.水取自同一井中,水井径窄,每次只能容纳一个水桶取水.设水 ...

  7. 操作系统PV大题_小和尚老和尚喝水问题

    题目描述 某寺庙有小和尚和老和尚若干人,水缸一只,由小和尚提水放入缸中给老和尚引用.水缸可容纳12桶水,水取自同一口水井,水井井口直径窄,每次仅能容纳一只水桶取水,水桶总数为4个.每次小和尚只能往水缸 ...

  8. 【操作系统】某寺庙,住着一个老和尚和若干小和尚,有一个水缸,由小和尚提水入缸供老和尚饮用。水缸可以容纳10桶水,水取自同一口井中,由于水井口窄,每次只能容纳一个水桶取水,水桶总数为3个。每次往水缸中倒

    题目 某寺庙,住着一个老和尚和若干小和尚,有一个水缸,由小和尚提水入缸供老和尚饮用.水缸可以容纳10桶水,水取自同一口井中,由于水井口窄,每次只能容纳一个水桶取水,水桶总数为3个.每次往水缸中倒水与从 ...

  9. 某寺庙,有小和尚、老和尚若干。有一水缸,由小和尚用水桶从井中提水入缸,老和尚用水桶从缸里取水饮用。水缸可容30桶水,水取自同一井中。水井径窄,每次只能容一个水桶取水。水桶总数为5个。每次入、取缸水仅为

    和尚取水问题 某寺庙,有小和尚.老和尚若干.有一水缸,由小和尚用水桶从井中提水入缸,老和尚用水桶从缸里取水饮用.水缸可容30桶水,水取自同一井中.水井径窄,每次只能容一个水桶取水.水桶总数为5个.每次 ...

  10. 小和尚和老和尚取水问题

    一.问题描述 某寺庙有小和尚.老和尚若干.有一水缸,由小和尚用水桶从井中提水入缸,老和尚用水桶从缸里取水饮用.水缸可容10桶水,水取自同一井中.水井径窄,每次只能容一个水桶取水.水桶总数为3个.每次入 ...

最新文章

  1. java 矩阵_(JAVA)计算机图形学与矩阵
  2. vue 项目 常用package.json
  3. 计算机不小心删除怎么找回桌面,如何将桌面上误删的文件找回
  4. 数据结构为什么那么难?
  5. yum第三方安装-软件包没签名及更新错误
  6. LeetCode MySQL 1179. 重新格式化部门表
  7. K8s如何在不重新打版本号的情况 更新镜像
  8. Win10安装Ubuntu双系统导致Win10时间有问题
  9. Java 冻结或解除冻结Excel中的行和列的方法
  10. 新浪微博开放平台开发步骤简介(适合新手看)
  11. 服务器存储位置,云储存位置及存储服务器
  12. Phoenix二级索引那些事儿(下)
  13. Ubuntu设置仅允许特定用户或特定IP通过ssh访问
  14. 《宝岛双雄》曝正式海报 房祖名挑大梁的银幕转型之作
  15. JavaWEB-04 项目案例(1)
  16. 修复XAMPP安装过程中 因端口80被占用 Apache无法启动的问题
  17. Echarts tooltip 自定义 css 样式 带小三角的背景样式
  18. [转] 一篇好文 ---steve jobs (stay hungry, stay foolish)
  19. c语言求三个数最值非函数,C语言编程:从键盘任意输入三个数,编写求其最大值、最小值的函数,用指针作函数参数实现。...
  20. qq引流有哪些模式? QQ引流的几种方法

热门文章

  1. 用opencv和python读取医学图片:mha
  2. 中文可以声明java类吗_JSP中可以声明基本类型和结构类型变量,但不能申明类,类必须放在JavaBean中。...
  3. 法语计算机相关书籍,法语网络计算机相关词汇
  4. 想要穷游北京?这些湖光山色的地方人少还景美!
  5. 戴维斯分校 计算机硕士,2017年美国加州大学戴维斯分校研究生申请之计算机......
  6. 谷歌统计Google Analytics使用入门
  7. 题解 【中学高级本-网络流24题】餐巾计划
  8. 传感器是新技术革命和当前信息社会的重要技术
  9. 在线Java/C++/C语言/Python/web网页编辑器(IDE)整理
  10. 【python】sys模块操作使用