最近学习多核多线程技术,最后的考试题目是和尚的问题。题目具体如下:

某寺庙有小和尚、老和尚若干。庙内有一水缸、由小和尚提水入缸,供老和尚引用。水缸可容纳10桶水,每次入水、取水都为1桶,且不可同时进行。水取自同一井中,水井口很小,每次只能容纳一只水桶取水。设水桶个数为3个。试写出小和尚和老和尚的函数,假设有5个小和尚同时提水入缸,5个老和尚同时取水喝(每隔一定时间取水一次),编写程序使他们能同步进行。

努力一下,最后终于写出来了。代码如下

#include"windows.h"
#include<iostream>
using namespace std;HANDLE sjing=CreateSemaphore(NULL,1,1,"sem1");//井的信号量
HANDLE stong=CreateSemaphore(NULL,2,2,"sem2");//小和尚用的水桶的信号量
HANDLE stong1=CreateSemaphore(NULL,1,1,"sem3");//老和尚用的水桶的信号量
HANDLE sgang=CreateSemaphore(NULL,1,1,"sem4");//水缸的信号量
HANDLE full=CreateSemaphore(NULL,0,10,"sem5");//缸中可以取的水的桶数
HANDLE empty=CreateSemaphore(NULL,10,10,"sem6");//缸中可以容纳的水桶数
int count=0;
CRITICAL_SECTION cs;DWORD WINAPI youngFunc(LPVOID pArg)
{int i=(int)pArg;while(1){WaitForSingleObject(stong,INFINITE);//小和尚先取得水桶printf("%d号小和尚拿到了桶\n",i);WaitForSingleObject(sjing,INFINITE);//小和尚先取得水井printf("%d号小和尚打上了水\n",i);ReleaseSemaphore(sjing,1,NULL);//小和尚释放水井Sleep(1000);WaitForSingleObject(empty,INFINITE);//判断水缸是否已满WaitForSingleObject(sgang,INFINITE);//取得水缸的使用printf("\t\t%d号小和尚向缸中倒水\n",i);EnterCriticalSection(&cs);count++;printf("\t\t缸中有%d桶\n",count);LeaveCriticalSection(&cs);ReleaseSemaphore(sgang,1,NULL);//释放水缸ReleaseSemaphore(stong,1,NULL);//释放水桶printf("%d号小和尚放下了桶\n",i);ReleaseSemaphore(full,1,NULL);//水缸中可使用水数量加1}return NULL;
}DWORD WINAPI oldFunc(LPVOID pArg)
{int i=(int)pArg;while(1){Sleep(4000);WaitForSingleObject(full,INFINITE);//判断水缸是否有水WaitForSingleObject(stong1,INFINITE);//取得水桶printf("\t\t\t\t\t%d号老和尚拿到了桶\n",i);WaitForSingleObject(sgang,INFINITE);//取得水缸的使用printf("\t\t\t\t\t%d号老和尚喝到了水\n",i);EnterCriticalSection(&cs);count--;printf("\t\t缸中有%d桶\n",count);LeaveCriticalSection(&cs);ReleaseSemaphore(sgang,1,NULL);//释放水缸ReleaseSemaphore(stong1,1,NULL);//释放水桶printf("\t\t\t\t\t\t\t%d号老和尚放下了桶\n",i);ReleaseSemaphore(empty,1,NULL);//水缸中可放水数量加1}return NULL;
}int main()
{   HANDLE young[5];HANDLE old[5];InitializeCriticalSection(&cs);for(int i=0;i<5;i++){young[i]=CreateThread(NULL,0,youngFunc,LPVOID(i),NULL,NULL);old[i]=CreateThread(NULL,0,oldFunc,LPVOID(i),NULL,NULL);}HANDLE p[2];p[0]=young;p[1]=old;WaitForMultipleObjects(5,p,TRUE,INFINITE);getchar();return 0;
}

题目中给了三个木桶,如果对木桶不进行区分,会产生死锁。当小和尚占了三个水桶,并且水缸中的水已经满了,这时候老和尚等待水桶取水,但是没有水桶了,老和尚只能等待。小和尚占着水桶,等待老和尚喝水,但是老和尚没有水桶没法喝,小和尚也只能一直等待。所以产生了死锁,所以才将水桶分开解决死锁。

多核多线程中小和尚老和尚取水喝水问题相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 爱发脾气如何治疗?这位老和尚出狠招让人惊讶

    原先有一个老和尚,修得很好,他嗔恨心老去不掉,老有火,一遇到烦恼他就发脾气了,但也不是老发,没有大事他也不发.但修行人和世间人的想法不一样,世间人的想法:这事已经不错了.但是佛法认为,有脾气那就是&q ...

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

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

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

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

最新文章

  1. 执行计划有时不准确_一张表格,帮助学生制定良好每日学习计划,提升学习积极性主动性...
  2. 软件工程中逻辑覆盖的例题_干货丨一文读懂:飞算全自动软件工程平台如何提升软件开发效率...
  3. 《新概念模拟电路》- 晶体管-西北模电王-杨建国著
  4. Desktop Aquarium Wallpaper‪s for mac(高清水族馆屏保)
  5. JAVA ANDROID电脑开发环境配置,说多了都是泪
  6. 传染病研究-靶向下一代宏基因组测序(mNGS)分析
  7. 在虚拟机上调试网络时要注意的内容
  8. c语言*p ,p,p的区别以及*p和**p的区别
  9. VMware中的虚拟机开启VT,支持KVM
  10. 微信小程序开发——动画效果
  11. 分布式秒杀电商-微服务架构图 上帝视角分析
  12. 华为杭州研究所面试记
  13. DC电源插头工作原理
  14. SR触发器和JK触发器
  15. 简单研究Unity中的万向锁和欧拉角以及四元数
  16. php用户注销代码,php注销代码(session注销)
  17. sco unix 管理员速成
  18. 理科生应该这样写情书
  19. 多元统计分析及R语言建模#学习笔记
  20. [PTA]实验3-1 求一元二次方程的根

热门文章

  1. 《士兵突击》能让你学到什么
  2. 把扫描文件转变为word文档的最实用的四款OCR识别软件
  3. 网站建设(5)——博客程序的选择和部署
  4. Ubuntu之ufw安装和使用
  5. 可汉学院python_18-04-18 回顾 可汗学院:计算数论
  6. 可汗学院统计学 task 3
  7. 和python高级知识分子的风骨_侯伯宇 一个高级知识分子的风骨
  8. java实现九宫格解锁_Java计算手机九宫格锁屏图案连接9个点的方案总数
  9. 牛客网 Wannafly挑战赛20 A-染色
  10. iPad 使用技巧:Apple Pencil