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

前言

大家好吖,欢迎来到 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;  
}

猜你喜欢

转载自blog.csdn.net/YYDsis/article/details/143321690