问题描述:桌上有一空盘,最多允许存放一个水果。爸爸可向盘中放一个苹果或放一个桔子,儿子专等吃盘中的桔子,女儿专等吃苹果。 编写Windows下父亲儿子女儿放取水果进程同步的演示程序。

问题分析及思路:

  1. 本题是生产者消费者的变形,不能用一个信号量解决问题。在本题中,爸爸、儿子、女儿共用一个盘子,且盘中一次只能放一个水果。当盘子为空时,爸爸可将一个水果放入盘中,若放入采盘中的是苹果,则允许女儿吃,儿子必须等待。若放入盘中的是桔子,则允许儿子吃,女儿必须等待。
  2. 那么盘子就是一个缓冲区(单缓冲),同一时刻,只能有一个人对它进行放和取得操作。所以盘子就是一个互斥信号量。而盘子上有苹果,且父亲没有放,儿子才能取,女儿也是同理。所以应该还有两个资源信号量:1 苹果 2 桔子
  3. 在由题意分析可知,三个信号量的初始值应该为 1 0 0 因为桌子只能放一个水果。而在开始的时候,桌子上是空的(所以可以进行放的操作),所以苹果、桔子初始资源量都为空。

代码如下:

#include<iostream>
#include<windows.h>
using namespace std; HANDLE g_apple = 0;//女儿线程互斥:表示可否取苹果
HANDLE g_orange = 0;//儿子线程互斥:表示可否取桔子
HANDLE g_hMutex = 0; //父亲线程互斥:表示可否向盘中放水果bool g_continue = true; //控制程序运行和结束
DWORD WINAPI Father(LPVOID); //父亲线程
DWORD WINAPI Son(LPVOID);//儿子线程
DWORD WINAPI Daughter(LPVOID);//女儿线程int main()
{//创建各个信号量g_orange = CreateSemaphore(NULL, 0, 1, NULL);g_apple = CreateSemaphore(NULL, 0, 1, NULL);g_hMutex = CreateSemaphore(NULL, 1, 1, NULL);DWORD threadID[3]; HANDLE hThreads[3];//创建父亲线程hThreads[0] = CreateThread(NULL, 0, Father, NULL, 0, &threadID[0]);if (hThreads == NULL) return -1;//创建儿子线程hThreads[1] = CreateThread(NULL, 0, Son, NULL, 0, &threadID[1]);if (hThreads == NULL) return -1;//创建女儿线程hThreads[2] = CreateThread(NULL, 0, Daughter, NULL, 0, &threadID[2]);if (hThreads == NULL) return -1;while (g_continue){if (getchar()){  //按回车后终止程序运行g_continue = false;}}return 0;
}//父亲线程
DWORD WINAPI Father(LPVOID lpPara)
{while (g_continue){WaitForSingleObject(g_hMutex, INFINITE);int m = rand() % 2;if (m == 1) {std::cerr << "父亲放入一个苹果!" << std::endl;Sleep(1500);ReleaseSemaphore(g_apple, 1, NULL);}else{std::cerr << "父亲放入一个桔子!" << std::endl;Sleep(1500);ReleaseSemaphore(g_orange, 1, NULL);}}return 0;
}//女儿线程
DWORD WINAPI Daughter(LPVOID lpPara)
{while (g_continue){WaitForSingleObject(g_apple, INFINITE);std::cerr << "女儿吃到一个苹果!" << std::endl;Sleep(1500);ReleaseSemaphore(g_hMutex, 1, NULL);}return 0;
}//儿子线程
DWORD WINAPI Son(LPVOID lpPara)
{while (g_continue){WaitForSingleObject(g_orange, INFINITE);std::cerr << "儿子吃到一个桔子!" << std::endl;Sleep(1500);ReleaseSemaphore(g_hMutex, 1, NULL);}return 0;
}

运行结果如下:

编写Windows下父亲儿子女儿放取水果进程同步的演示程序。(C/C++)相关推荐

  1. Windows下父亲儿子女儿放取水果进程同步的演示程序

    问题描述 桌上有一空盘,最多允许存放一个水果.爸爸可向盘中放一个苹果或放一个桔子,儿子专等吃盘中的桔子,女儿专等吃苹果.试用P.V操作实现爸爸.儿子.女儿三个并发进程的同步.提示:设置一个信号量表示可 ...

  2. 父亲儿子女儿放取水果进程/线程间通信程序设计与实现

    父亲儿子女儿放取水果进程/线程间通信程序设计与实现 代码: #include<unistd.h> #include<stdio.h> #include<pthread.h ...

  3. 父亲儿子女儿三人水果分配

    问题:桌子上有一个空盘子,允许存放一只水果.爸爸可向盘中放苹果,也可向盘中放橘子.儿子专等吃苹果,女儿专等吃橘子.规定盘中空时,一次只能放一个水果供吃者取用. 要求:使用P.V原语实现爸爸.儿子.女儿 ...

  4. 操作系统-父亲儿子女儿分苹果桔子进程同步

    #include<iostream> #include<windows.h> #include<stdio.h> using namespace std; HAND ...

  5. 【开发工具】之windows下gnu makefile编写

    序  本文旨在示例怎么编写windows下的makefile, 依赖于"GnuWin32",可自行网上下载. 安装方法一: 下载网址:http://gnuwin32.sourcef ...

  6. windows下编写dll

    dll的优点 简单的说,dll有以下几个优点: 1) 节省内存.同一个软件模块,若是以源代码的形式重用,则会被编译到不同的可执行程序中,同时运行这些exe时这些模块的二进制码会被重复加载到内存中.如果 ...

  7. 如何编写linux批处理文件,Linux和Windows下的批处理文件编写

    一.Linux下批处理文件编写 1.先建一个文档,如名为test,修改其文件权限使其为可执行文件. sudo  chmod  +x  test 2.打开test文档,编辑. cd  绝对路径 for  ...

  8. windows下自制动画层引擎 - 放两个demo

    一年前想写一个像cocoa那样,可以方便层动画开发的引擎,写着写着又逆向它的QuartzCore.framework,也就是CoreAnimation的底层,已经大半年没有搞windows这个引擎.大 ...

  9. KETTLE调度第三篇:Windows下调度Dos脚本编写和遇到的一些问题解决

    KETTLE调度第三篇:Windows下调度Dos脚本编写和遇到的一些问题解决 参考文章: (1)KETTLE调度第三篇:Windows下调度Dos脚本编写和遇到的一些问题解决 (2)https:// ...

最新文章

  1. mysql是如何管理数据结构_MySQL索引背后的数据结构和原理
  2. python os.environ.setdefault_django os.environ慎用setdefault操作环境变量
  3. 拼接字符串时去掉最后一个多余逗号
  4. python画图武汉加油-python实现“武汉加油”点阵字
  5. 浅谈Linux中ldconfig和ldd的用法
  6. IAAS、SAAS、PAAS
  7. 计算机桌面图标有背影,桌面图标有背影怎么解决
  8. 名为 cursor_jinserted 的游标不存在_性能优化技巧 - 程序游标
  9. SQL Server 2012附加数据库报错
  10. k 近邻算法解决字体反爬手段|效果非常好
  11. linux下载python的地址_Linux下Python获取IP地址的代码
  12. web app开发利器 - iscroll4 解决方案
  13. python编程可以自学么-python编程还能自学?怎么能学好? - 【大连东软睿道】
  14. 网站如何配置CDN加速?网站域名接入腾讯云CDN的步骤(附CDN防御)
  15. dcm4chee汉化_docker dcm4chee
  16. 2017年美国大学生数学建模竞赛F题优秀论文解读
  17. java菜鸟教程chm文档_菜鸟教程Servlet零基础jsp学习java编程.docx
  18. G16C如何切换语言,怎样使用 WinCC (TIA 博途) 实现在 SIMATIC HMI 面板中语言切换功能?...
  19. 仿支付宝输入密码界面
  20. OpenAI注册(ChatGPT)

热门文章

  1. FormData简介
  2. Vue前端项目-首页-获取角色
  3. 连接数据孤岛,巨杉数据库与 Tapdata 联合共建开放数据生态
  4. html div 内部左右布局,div布局大全
  5. spacevim迁移手册(记录)
  6. ChatGPT身份指令关键词
  7. 扫地机器人排行榜 扫地机器人哪个牌子好?
  8. 计算机通信中应用的调制解调与无线电通信,[转载]无线通信系统中的调制解调基础(一):AM和FM...
  9. js数组indexof用法-1 0 1代表的意思
  10. 康师傅-java基础-01days