游戏规则:

桌子上有一个盘子,盘子中可以放置的水果数量一定,妈妈可以一次放入一个橙子,爸爸可以一次放入一个苹果,儿子一次吃一个苹果,女儿一次吃一个橙子。

利用信号量来实现这一过程,使得四个人可以有条不紊的进行优秀。

//
//  apple_orange.c
//
//
//  Created by YIN on 2021/5/24.
//#include "apple_orange.h"
#include "stdio.h"
#include "pthread.h"
#include "semaphore.h"
#include <unistd.h>
#include <dispatch/dispatch.h>
#define N 5
dispatch_semaphore_t empty;
dispatch_semaphore_t apple;
dispatch_semaphore_t orange;
dispatch_semaphore_t mutex;int fruitCount = 0;void* motherThd(void* arg)
{while(1){dispatch_semaphore_wait(empty, DISPATCH_TIME_FOREVER);dispatch_semaphore_wait(mutex, DISPATCH_TIME_FOREVER);printf("妈妈放入一个橙子,盘子中当前水果共:%d\n",++fruitCount);dispatch_semaphore_signal(mutex);dispatch_semaphore_signal(orange);sleep(1);}
}void* fatherThd(void* arg)
{while(1){dispatch_semaphore_wait(empty, DISPATCH_TIME_FOREVER);dispatch_semaphore_wait(mutex, DISPATCH_TIME_FOREVER);printf("爸爸放入一个苹果,盘子中当前水果共:%d\n",++fruitCount);dispatch_semaphore_signal(mutex);dispatch_semaphore_signal(apple);sleep(2);}
}void* sonThd(void* arg)
{while(1){dispatch_semaphore_wait(apple, DISPATCH_TIME_FOREVER);dispatch_semaphore_wait(mutex, DISPATCH_TIME_FOREVER);printf("儿子拿走一个苹果,盘子中当前水果共:%d\n",--fruitCount);dispatch_semaphore_signal(mutex);dispatch_semaphore_signal(empty);sleep(1);}
}void* daughterThd(void* arg)
{while(1){dispatch_semaphore_wait(orange, DISPATCH_TIME_FOREVER);dispatch_semaphore_wait(mutex, DISPATCH_TIME_FOREVER);printf("女儿拿走一个橙子,盘子中当前水果共:%d\n",--fruitCount);dispatch_semaphore_signal(mutex);dispatch_semaphore_signal(empty);sleep(2);}
}int main(int argc, char const *argv[])
{pthread_t father, mother, son, daughter;dispatch_semaphore_t *sem_e = &empty;*sem_e = dispatch_semaphore_create(5);dispatch_semaphore_t *sem_a = &apple;*sem_a = dispatch_semaphore_create(0);dispatch_semaphore_t *sem_o = &orange;*sem_o = dispatch_semaphore_create(0);dispatch_semaphore_t *sem_m = &mutex;*sem_m = dispatch_semaphore_create(1);pthread_create(&father, NULL, fatherThd, NULL);pthread_create(&mother, NULL, motherThd, NULL);pthread_create(&son, NULL, sonThd, NULL);pthread_create(&daughter, NULL, daughterThd, NULL);pthread_join(father, NULL);pthread_join(mother, NULL);pthread_join(son, NULL);pthread_join(daughter, NULL);return 0;}

信号量实现同步之苹果橘子问题相关推荐

  1. 【C# winform】操作系统:进程同步程序设计——多生产者多消费者苹果橘子实验

    实验内容 桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果.爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,儿子专门等待吃盘子中的橘子,女儿专门等吃盘子中的苹果.试编程实现爸爸.妈妈 ...

  2. 进程间共享内存(信号量实现同步)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://yongjiuzhizhen.blog.51cto.com/7980250/132 ...

  3. 【转】细说.NET中的多线程 (五 使用信号量进行同步)

    上一节主要介绍了使用锁进行同步,本节主要介绍使用信号量进行同步 使用EventWaitHandle信号量进行同步 EventWaitHandle主要用于实现信号灯机制.信号灯主要用于通知等待的线程.主 ...

  4. 操作系统中PV操作实现进程同步与互斥问题(以苹果橘子问题为例)

    桌上有一空盘,允许存放一个水果.爸爸可向盘中放苹果,也可向盘中放桔子, 儿子专等吃盘中的桔子,女儿专等吃盘中的苹果.规定当盘空时,一次只能放一个水果供吃者取用, 请用P.v原语实现爸爸.儿子.女儿三个 ...

  5. linux多线程学习(六)——信号量实现同步

    在上一篇文章中已经用信号量来实现线程间的互斥,达到了互斥锁的效果,今天这篇文章将讲述怎样用信号量去实现同步. 信号量的互斥同步都是通过PV原语来操作的,我们可以通过注册两个信号量,让它们在互斥的问题上 ...

  6. 水果整理篇--苹果橘子

    面向对象:把数据及对数据的操作方法放在一起,作为一个相互依存的整体--对象.对同类对象抽象出其 共性(属性) ,形成类.类中的大多数数据,只能用本类的 方法 进行处理.类通过一个简单的外部接口与外界发 ...

  7. PS创意合成苹果橘子

    首先我们找到一个苹果素材,然后打开. 第二步,我们再放入柠檬的素材 第三步,我们思考一下,既然要合成,我们就要进行抠图,所以这一步,我们选取一个柠檬瓣,用钢笔抠下来,如图 第四步,好了,柠檬瓣已经抠出 ...

  8. 【iCore3 双核心板_ uC/OS-III】例程七:信号量——任务同步

    实验指导书及代码包下载: http://pan.baidu.com/s/1kVjeN2n iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  9. [教学]cyclegan风格迁移_斑马to白马_油画风格_苹果橘子等

    上效果图: 01train_cyclegan.py的前几行是配置参数,我们可以自行修改 import torch import sys from torch.utils.data import Dat ...

最新文章

  1. python100行代码-100 Lines Python
  2. mysql--SQL编程(关于mysql中的日期,关于重叠) 学习笔记2.2
  3. Linux基础7 文件管理类命令
  4. mysql8.0默认引擎是什么_MySQL8.0新特性【转】
  5. 推荐一款cpp解析json工具--rapidjson
  6. Solr6.1.0Windows安装步骤
  7. php m grep event,php-如何杀死与30分钟以上的grep匹配的进程?
  8. PostgreSQL客户端psql常用命令
  9. 如何将枯燥的大数据呈现为可视化的图?
  10. Flutter进阶—实现动画效果(五)
  11. 并发的线程入门到并发安全原理解析,offer拿到手软
  12. 综合后端各种类型文件
  13. linux 内存管理_真香!Linux 原来是这么管理内存的
  14. [裴礼文数学分析中的典型问题与方法习题参考解答]4.4.8
  15. mina简单实用_Mina框架的简单例子
  16. C++11新特性——std::bind参数绑定
  17. 网易Airtest跨平台的UI自动化测试框架
  18. ISP算法:gamma矫正
  19. Ubuntu18.04安装RTL8125/RTL8168等网卡驱动程序
  20. Check list of writing

热门文章

  1. Explore the Sky丨来 TiDB Hackathon 2021 探索无限可能
  2. mysql执行语句时c盘突然占满_C盘突然变满了,怎么办?
  3. Python,查看内存内容,类似HxD的排列
  4. 第二章 编程练习(C++ Primer Plus)
  5. 下拉框选中状态html,js中select下拉框选中
  6. 莫烦python-Tensorflow笔记
  7. python前端学习之css
  8. iPhone 14 系列来了!能动的“药丸屏”,Plus 型号回归,最高售价 13499 元
  9. 诸葛io , 面向数据智能时代的大数据实践(下)
  10. ESP32上手笔记 | 02 - ESP32-Arduino开发环境搭建