前言
大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁
主要内容含:
欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!
目录
一.<信号量>相关实验回顾
1.回顾:使用<信号量>实现<线程互斥>——(解析:用信号量实现两个线程互斥输出1-10数字)
使用<信号量>实现<线程互斥>——(解析:用信号量实现两个线程互斥输出1-10数字)
2.回顾:巧妙运用< 信号量 >控制 <两个线程>之间<谁先执行>
巧妙运用< 信号量 >控制 <两个线程>之间<谁先执行>
3.回顾:巧妙运用<信号量>实现<控制n线程>之间<按什么顺序轮转>
巧妙运用<信号量>实现<控制n线程>之间<按什么顺序轮转>
二. 巧妙运用<信号量>解决<水果放取问题>(思维导图&代码演示&思路解析)
要求:
- 一个盘子里只能放一个水果,爸爸往里面放苹果妈妈往里面放橘子,儿子专等吃橘子,女儿专等吃苹果;
- 只要盘子空,爸爸或妈妈就可以往里面放水果;
- 仅当盘子里有自己需要的水果时,儿子或女儿才可以取出吃;
解析:
- 设置三个信号量,plate=1,优先执行,面向父母端;两个信号量appleReady,orangeReady,分别设置成0,分别对应两个孩子
- 设置
fruitOnPlate,fruitType,#define APPLE 1 #define ORANGE 2
,表示父母端,放入苹果/橘子- 如下面流程图一样设置 信号量等待(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