当前位置: 首页 > article >正文

信号量机制之苹果-橘子问题

桌上有一空盘,允许存放一种水果。爸爸可向盘中放苹果,也可向盘中放橘子,儿子专等吃盘中的橘子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一个水果供吃者取用。

要求:请用信号量机制实现爸爸、儿子、女儿三个并发进程的同步。

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>

// 定义信号量
sem_t empty;  // 盘子是否为空
sem_t apple;  // 盘子中的苹果数量
sem_t orange; // 盘子中的橘子数量

// 爸爸放水果的操作
void *father(void *arg) {
    while (1) {
        sem_wait(&empty);   // 盘子为空时,爸爸才可以放水果

        if (rand() % 2 == 0) {  
            printf("爸爸把一个苹果放进盘子里。\n");
            sem_post(&apple);   
        } else {
            printf("爸爸把一个橘子放进盘子里。\n");
            sem_post(&orange);  
        }
    }
    return NULL;
}

// 儿子取水果
void *son(void *arg) {
    while (1) {
        sem_wait(&orange);  
        printf("儿子从盘子里吃了一个橘子。\n");
        sem_post(&empty);   
    }
    return NULL;
}

// 女儿取水果
void *daughter(void *arg) {
    while (1) {
        sem_wait(&apple);  
        printf("女儿从盘子里吃了一个苹果。\n");
        sem_post(&empty);  
    }
    return NULL;
}

int main() {
    pthread_t father_thread, son_thread, daughter_thread;

    // 初始化信号量
    sem_init(&empty, 0, 1);  // 盘子初始为空
    sem_init(&apple, 0, 0);  // 初始苹果
    sem_init(&orange, 0, 0); // 初始橘子

    pthread_create(&father_thread, NULL, father, NULL);
    pthread_create(&son_thread, NULL, son, NULL);
    pthread_create(&daughter_thread, NULL, daughter, NULL);

    pthread_join(father_thread, NULL);
    pthread_join(son_thread, NULL);
    pthread_join(daughter_thread, NULL);

    sem_destroy(&empty);
    sem_destroy(&apple);
    sem_destroy(&orange);

    return 0;
}


http://www.kler.cn/a/503331.html

相关文章:

  • C#,入门教程(27)——应用程序(Application)的基础知识
  • 第27章 汇编语言--- 设备驱动开发基础
  • ctf竞赛
  • HarmonyOS NEXT开发进阶(六):HarmonyOS NEXT实现嵌套 H5 及双向通信
  • 2025 年 UI 大屏设计新风向
  • Mysql--架构篇--体系结构(连接层,SQL层,存储引擎层,文件存储层)
  • 【汇编】x86汇编编程寄存器资源心中有数
  • vulnhub靶场【IA系列】之Tornado
  • 地瓜机器人RDK Studio使用入门教程
  • 《自动驾驶与机器人中的SLAM技术》ch10:自动驾驶车辆的实时定位系统
  • 解决 vxe-table 的下拉框、日期选择等组件被 element-plus element-ui 弹窗遮挡问题 z-index
  • es 3期 第23节-运用Pipeline实现二转聚合统计
  • 【AI日记】25.01.14
  • 【Linux】从零开始:编写你的第一个Linux进度条小程序
  • PostgreSQL技术大讲堂 - 第78讲:分布式数据库-GreenPlum应用实践
  • 实战threeJS数字孪生开源 数字工厂
  • 关于扫描模型 拓扑 和 传递贴图工作流笔记
  • python检测gitlab中某个标签在一个月内添加和移除了多少次
  • Microsoft
  • 【微信小程序】let和const-综合实训
  • 【spring mvc】文件上传、下载
  • 【练习】力扣热题100 有效的括号
  • C# 多线程基础 锁 死锁 Monitor lock
  • 【Delete 删除数据语法合集】.NET开源ORM框架 SqlSugar 系列
  • Linux Centos 安装Jenkins到服务
  • java_mybatis_mapper_sql语句示例