#include<iostream>
#include<windows.h>
#include<stdio.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)
{
    int count;
    while (g_continue){
        WaitForSingleObject(g_apple, INFINITE);
        std::cerr << "女儿吃到一个苹果!" << std::endl;
        Sleep(1500);
        count++;
        if(count>3){
            break;
        }
        printf("女儿共吃%d个苹果\n",count);
        ReleaseSemaphore(g_hMutex, 1, NULL);
    }
    return 0;
}

//儿子线程
DWORD WINAPI Son(LPVOID lpPara)
{
    int num;
    while (g_continue){
        WaitForSingleObject(g_orange, INFINITE);
        std::cerr << "儿子吃到一个桔子!" << std::endl;
        Sleep(1500);
        num++;
        if(num>8){
            break;
        }
        printf("儿子共吃%d个桔子\n",num);
        ReleaseSemaphore(g_hMutex, 1, NULL);
        
    }
    return 0;
}

操作系统-父亲儿子女儿分苹果桔子进程同步相关推荐

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

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

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

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

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

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

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

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

  5. 操作系统同步问题:有一个没有限量的大盘子,爸爸只往里面放苹果,妈妈只往里面放桔子,儿子只拿苹果吃,女儿只拿桔子吃,请写出能描述4个人行为的同步方案

    有一个没有限量的大盘子,爸爸只往里面放苹果,妈妈只往里面放桔子,儿子只拿苹果吃,女儿只拿桔子吃,请写出能描述4个人行为的同步方案. Program father: begin: repeat:prod ...

  6. 操作系统经典问题之爸爸放苹果妈妈放橘子儿子吃橘子女儿吃苹果问题

    一.爸爸放苹果妈妈放橘子儿子橘子女儿吃苹果问题 现在有一个盘子,爸爸向这个盘子里放苹果,妈妈向这个盘子里放橘子.儿子只从这个盘子里拿妈妈放置的橘子吃,而女儿从这个盘子里拿爸爸放的苹果吃.这是由生产者- ...

  7. 练习 苹果-桔子线程【操作系统】

    苹果-桔子线程 题目 实现 资料 题目 桌上有一空盘,允许存放一个水果. 爸爸可向盘中存放苹果,也可向盘中存放桔子, 儿子专等吃盘中的桔子, 女儿专等吃盘中的苹果. 规定当盘空时一次只能放一只水果供吃 ...

  8. 苹果-桔子问题(生产者-消费者问题)

    苹果-桔子问题是操作系统中P.V操作部分经典的问题,属于复杂一点的生产者-消费者问题,可以抽象的理解为两个生产者和两个消费者被连接到大小为1的缓冲区上. #实现语言:C# #问题描述: 桌子上有一只盘 ...

  9. c语言实例--巧分苹果

    问题:一家农户以果园为生,一天,父亲推出一车苹果,共2520个,准备分给他的6个儿子.父亲按事先写在一张纸上的数字把这堆苹果分完,每个人分到的苹果个数都不相同.他说:"老大,把你分到的苹果的 ...

最新文章

  1. mongodb地理位置索引实现原理
  2. 拉丁法谚讲习1-24 【ZZ】
  3. SAP Spartacus里的concurrently依赖
  4. php变量前下滑_PHP变量
  5. 如何写年终总结(转)
  6. linux原理与应用期末考试,武汉大学计算机学院2009-2010学年第一学期期末考试《Linux原理与应用》期末考试试卷(共8套,有答案)...
  7. 侧边栏_第四课 侧边栏和过滤器
  8. Python入门--递归函数
  9. Python项目开发基础 -- with open (filename) as 读写文件
  10. 我的JavaScript学习之路四:JavaScript数据类型之Number类型(1)
  11. SPSS Modeler泰坦尼克号幸存者分析
  12. video在iPhone浏览器上播放没有声音
  13. php sapi全拼,php sapi type
  14. Unix File Permissions ACLs in OS X(part 2)
  15. Unity 自定义Image形状
  16. 中关村科技企业融资缺口700亿 商业银行垂涎
  17. 黄金的18K和24K是什么意思
  18. android壁纸 镭光,Blur Wallpaper
  19. Windows 版本说明,Enterprise、Ultimate、Home、Professional知多少?
  20. Failed to build custom metric java.lang.NumberFormatException: For input string: “∞“

热门文章

  1. CPU、GPU、TPU是个啥?
  2. 搭建Eclipse PHP开发环境
  3. 数学计算机教学课题,【小课题】     信息技术与数学学科教学整合案例
  4. linux下i2c与pca9555通信,pca9555(i2c-gpio扩展)应用层测试代码
  5. android打开视频噔_Android中三种视频的播放
  6. 主流时序数据库分析及选型
  7. WebService技术架构
  8. 服务器托管的必要性(上)
  9. python为源文件指定系统默认字符编码是_系统编码、文件编码与python系统编码
  10. 铨顺宏RFID:医院工作人员/养老院UWB工作人员定位解决方法