首页 > 系统相关 >【Linux】巧妙运用<信号量>解决<水果放取问题>(思维导图&代码演示&思路解析)

【Linux】巧妙运用<信号量>解决<水果放取问题>(思维导图&代码演示&思路解析)

时间:2024-10-31 16:20:55浏览次数:3  
标签:YY thread 导图 放取 信号量 专栏 sem NULL

前言

大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁
主要内容含:
在这里插入图片描述

欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!

目录

一.<信号量>相关实验回顾

1.回顾:使用<信号量>实现<线程互斥>——(解析:用信号量实现两个线程互斥输出1-10数字)

使用<信号量>实现<线程互斥>——(解析:用信号量实现两个线程互斥输出1-10数字)

2.回顾:巧妙运用< 信号量 >控制 <两个线程>之间<谁先执行>

巧妙运用< 信号量 >控制 <两个线程>之间<谁先执行>

3.回顾:巧妙运用<信号量>实现<控制n线程>之间<按什么顺序轮转>

巧妙运用<信号量>实现<控制n线程>之间<按什么顺序轮转>

二. 巧妙运用<信号量>解决<水果放取问题>(思维导图&代码演示&思路解析)

要求:

  • 一个盘子里只能放一个水果,爸爸往里面放苹果妈妈往里面放橘子,儿子专等吃橘子,女儿专等吃苹果;
  • 只要盘子空,爸爸或妈妈就可以往里面放水果;
  • 仅当盘子里有自己需要的水果时,儿子或女儿才可以取出吃;

解析:

  1. 设置三个信号量,plate=1,优先执行,面向父母端;两个信号量appleReady,orangeReady,分别设置成0,分别对应两个孩子
  2. 设置fruitOnPlate,fruitType,#define APPLE 1 #define ORANGE 2,表示父母端,放入苹果/橘子
  3. 如下面流程图一样设置 信号量等待(P操作),信号量唤醒(V操作)

流程图示意:
在这里插入图片描述

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

#define APPLE 1
#define ORANGE 2
//表示放入水果
int fruitOnPlate=0;
int fruitType=0;  

//设置信号量
sem_t plate, appleReady, orangeReady;  
  
void *father(void *arg) {  
    while (1) {  
        sem_wait(&plate);  
        
        fruitOnPlate = APPLE;  //放入苹果
        fruitType=APPLE;
         
        printf("Father put an apple.\n");  
        sem_post(&appleReady);  
        sleep(rand() % 10); //睡眠随机时间  
    }  
}  
  
void *mother(void *arg) {  
    while (1) {  
        sem_wait(&plate); 
        
        fruitOnPlate = ORANGE;       //放入橘子
        fruitType=ORANGE;
        
        printf("Mother put an orange.\n");  
        sem_post(&orangeReady); 
        sleep(rand() % 10); //睡眠随机时间   
    }  
}  
  
void *son(void *arg) {  
    while (1) {  
        sem_wait(&orangeReady); // 等待橘子
        if (fruitType == ORANGE) {  
            printf("Son ate an orange.\n");  
            sem_post(&plate);
        }  
    }  
}  
  
void *daugther(void *arg) {  
    while (1) {  
        sem_wait(&appleReady); // 等待苹果
        if (fruitType == APPLE) {  
            printf("Daugther ate an orange.\n");  
            sem_post(&plate);
        }  
    }  
}  
  
int main() {  
    pthread_t f_thread,m_thread,son_thread,dau_thread;
  
    sem_init(&plate, 0, 1);  
    sem_init(&appleReady, 0, 0);  
    sem_init(&orangeReady, 0, 0); 
  
    pthread_create(&f_thread, NULL, father, NULL);  
    pthread_create(&m_thread, NULL, mother, NULL);  
    pthread_create(&son_thread, NULL, son, NULL);  
    pthread_create(&dau_thread, NULL, daughter, NULL);  
  
    pthread_join(f_thread, NULL);  
    pthread_join(m_thread, NULL);  
    pthread_join(son_thread, NULL);  
    pthread_join(dau_thread, NULL);  
  
    sem_destroy(&plate);  
    sem_destroy(&appleReady);  
    sem_destroy(&orangeReady);  
  
    return 0;  
}

标签:YY,thread,导图,放取,信号量,专栏,sem,NULL
From: https://blog.csdn.net/YYDsis/article/details/143321690

相关文章

  • Python中使用共享变量+信号量实现进程间的实时通信
    【Python程序1中】importctypesimportposix_ipcimportmultiprocessingfrommultiprocessingimportshared_memory#如果系统中已经存在名为/semaphore1的信号量对象,Python并不会重新初始化它,而是使用现有的信号量,#导致现有的信号量可能有残留状态,使得acquire()一直阻......
  • Markmap,用Markdown语法轻松创建思维导图,AI助力提升工作效率
    Markmap介绍首先,什么是Markmap?Markmap是一个开源项目,旨在用Markdown语法来制作思维导图。它的目的是:允许你使用简单的Markdown语法来快速编写思维导图。值得一提的是,中文Markmap在此基础上进一步引入了AI技术,实现了自动生成思维导图的功能。用户只需输入内容,AI就会自......
  • 2024年13个热门AI工具:涵盖思维导图、对话助理、绘画提示、批量抠图、翻译、音乐生成、
    本次分享的AI工具各具特色,涵盖了思维导图、对话助理、绘画提示、批量抠图、翻译、音乐生成、写作辅助、在线工具箱、文案撰写、图像生成和视频生成等多个领域,能够满足大家在不同场景下的需求。产品名称链接介绍笔墨写作www.bimoxiezuo.com笔墨写作是一款专注于各种文体写作的......
  • 1.思维导图
    数据结构和算法线性表数组链表单链表双向链表循环链表双向循环链表静态链表栈顺序栈链式栈队列普通队列双端队列阻塞队列并发队列阻塞并发队列树二叉树平衡二叉树AVL树红黑树完全二叉树满二叉树平衡二叉查找树多路查找树B树B+树2-3树......
  • 【思维导图】C语言—数据类型和变量
     今天我们来回顾——C语言【数据类型和变量】我们先梳理一下思路:首先学习数据的类型,然后学会用类型去创建变量,接着学习操作符进行变量之间的运算,最后学习scanf输入数据,printf进行数据的打印。回顾的时候最好结合代码的编写,才能更好更直观地理解知识的用法。 我已经把思......
  • 408计算机网络ss1思维导图
                  ......
  • 用思维导图梳理的 Promise,看完这篇就够了
    1.对Promise的理解2.什么是Promise链?letpromise=newPromise((resolve,reject)=>{ constcontrol=true control&&resolve(res);//如果control为true,就执行resolve(res) reject(err) //若为false,就执行reject(err)}promise.then(res=>console.log(......
  • Tokio信号量:掌握并发控制的艺术
    在现代并发编程中,合理控制任务的并发执行是确保系统稳定性和资源有效利用的关键。Tokio,作为Rust生态中强大的异步运行时,为我们提供了一系列的同步原语,其中信号量(Semaphore)尤为强大。它允许我们精确控制对共享资源的并发访问,是实现限流和防止资源耗尽的理想工具。本文将深入......
  • 第七周学习思维导图
     code代码为:graphLR  A[密码系统设计第七周]-->B[《WindowsC/C++加密解密实战》]  B-->C[第十章]  C-->T[对称加密]  C-->U[非对称加密]  C-->V[哈希函数]  T-->X[AES]  U-->d[RSA]  V-->e[SHA-256]  B-->......
  • 操作系统(6) (Named /Unnamed Semaphore信号量详解)
    目录1:信号量的基本概念2:命名信号量的示例代码3.无名信号量(UnnamedSemaphore)背景(Background)示例代码讲解初始化无名信号量线程函数创建线程并等待完成销毁信号量总结4.对比1:信号量的基本概念背景介绍:信号量是一种并发编程中的同步原语,它用于协调多......