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

操作系统实训复习笔记(第7关:生产者消费者问题实践)

目录

第7关:生产者消费者问题实践

第1关:生产者消费者问题实践

1、在主线程中初始化锁为解锁状态

2、访问对象时的加锁操作与解锁操作

3、(生产和消费进程操作后)信号量操作实现进程同步

4、先等待(生产还是消费)需要的条件

5、生产者函数

6、消费者函数

第2关:进程互斥和同步

1、注意这以下4个的关系:

2、一般情况哪两个函数的参数一起配套使用

3、在第一次用完这些函数之后记得写上互斥锁,然后再调用这一类函数时之前要释放互斥锁。

4、儿子的消费进程

5、父亲的生产进程

6、女儿的消费进程


第7关:生产者消费者问题实践

第1关:生产者消费者问题实践

1、在主线程中初始化锁为解锁状态
  • pthread_mutex_t mutex;
  • pthread_mutex_init(&mutex, NULL);
2、访问对象时的加锁操作与解锁操作
  • 加锁 pthread_mutex_lock(&mutex);
  • 释放锁 pthread_mutex_unlock(&mutex);
3、(生产和消费进程操作后)信号量操作实现进程同步
  • 信号量加1操作:int sem_post(sem_t *sem);
  • 销毁信号量:int sem_destroy(sem_t *sem);
4、先等待(生产还是消费)需要的条件
  • sem_wait(&empty);
  • sem_wait(&full);

5、生产者函数
void *Producer()
{int nextp = 0;int i = 0;for(; i < 10; ++i){  int time = rand() % 10 + 1;usleep(time*100000); sem_wait(&empty);   //等待缓冲区有空位置,为空pthread_mutex_lock(&mutex);nextp = nextp + 1;buffer[in] = nextp;printf("Produce one message:%d\n", nextp);fflush(stdout);//printf后请一定调用这句刷新输出缓存in = (in + 1) % SIZE;pthread_mutex_unlock(&mutex);         //互斥锁解锁sem_post(&full);}
}
6、消费者函数

void *Consumer()
{//请补充消费者线程函数代码int nextc = 0;int i=0;for(;i<10;i++){sem_wait(&full);     //等待缓冲区有东西,不为空pthread_mutex_lock(&mutex); //加锁nextc= buffer[out];printf("Consume one message:%d\n", nextc);fflush(stdout);//printf后请一定调用这句刷新输出缓存out = (out + 1) % SIZE;pthread_mutex_unlock(&mutex);         //互斥锁解锁sem_post(&empty);
}

第2关:进程互斥和同步

(这个就比较简单的,仿照着写,读懂上一题就会写了)

1、注意这以下4个的关系:
  •  sem_wait(&empty); (意思是只要有空位置开始生产)
  • sem_post(&empty);(消费完就要提示空的位置+1)
  • sem_wait(&full);  (意思是只要有生产的东西开始消费)
  • sem_post(&full);(生产完就要提示已经生产的东西+1)
2、一般情况哪两个函数的参数一起配套使用
  • 在生产进程中:先判断是否有空位置(sem_wait(&empty);)最后在生产结束之后告诉生产的东西+1(sem_post(&full);)
  • 在消费的进程中:先判断是否有已经生产好的东西(sem_wait(&full);)最后在消费完之后提示空的位置+1(sem_post(&empty);)
3、在第一次用完这些函数之后记得写上互斥锁,然后再调用这一类函数时之前要释放互斥锁。
4、儿子的消费进程

(注意这里的消费的东西是:"&orange")

void *Son()
{//请添加儿子线程的函数代码while(1){int time = rand() % 10 + 1;          //随机使程序睡眠0点几秒usleep(time * 100000);        sem_wait(&orange); pthread_mutex_lock(&mutex);printf("儿子取了一个桔子\n") ;fflush(stdout);pthread_mutex_unlock(&mutex);         //互斥锁解锁sem_post(&empty);}
}
5、父亲的生产进程

(生产的是苹果:"&apple" 和 "&orange")

void *Dad()
{int nextp = 0;int i = 0;for(i = 0; i < 10; ++i){int time = rand() % 10 + 1;          //随机使程序睡眠0点几秒usleep(time*100000);        sem_wait(&empty); pthread_mutex_lock(&mutex);if(nextp == 0){printf("爸爸放入了一个苹果\n");}else{printf("爸爸放入了一个桔子\n");}fflush(stdout);pthread_mutex_unlock(&mutex);         //互斥锁解锁if(nextp == 0){sem_post(&apple);}else{sem_post(&orange);} nextp = 1 - nextp; }
}
6、女儿的消费进程

(注意这里的消费的东西是:"&apple")

void *Daughter()
{while(1){int time = rand() % 10 + 1;          //随机使程序睡眠0点几秒usleep(time * 100000);        sem_wait(&apple); pthread_mutex_lock(&mutex);printf("女儿取了一个苹果\n") ;fflush(stdout);pthread_mutex_unlock(&mutex);         //互斥锁解锁sem_post(&empty);}
}

相关文章:

操作系统实训复习笔记(第7关:生产者消费者问题实践)

目录 第7关&#xff1a;生产者消费者问题实践 第1关&#xff1a;生产者消费者问题实践 1、在主线程中初始化锁为解锁状态 2、访问对象时的加锁操作与解锁操作 3、&#xff08;生产和消费进程操作后&#xff09;信号量操作实现进程同步 4、先等待&#xff08;生产还是消费…...

通过物联网管理多台MQTT设备-基于全志T527开发板

一、系统概述 基于米尔-全志 T527设计一个简易的物联网网关&#xff0c;该网关能够管理多台MQTT设备&#xff0c;通过MQTT协议对设备进行读写操作&#xff0c;同时提供HTTP接口&#xff0c;允许用户通过HTTP协议与网关进行交互&#xff0c;并对设备进行读写操作。 二、系统架…...

Python学习前简介

1.python简介 2.python特点 3.python解释器 4.pyCharm简介 一、python简介 Python是一种高级编程语言&#xff0c;用于多种应用&#xff0c;包括网站开发、数据科学、人工智能、机器学习、桌面应用、网络应用、软件开发、网络爬虫等。它由Guido van Rossum于1991年首次发布&am…...

【Text2SQL 论文】MAGIC:为 Text2SQL 任务自动生成 self-correction guideline

论文&#xff1a;MAGIC: Generating Self-Correction Guideline for In-Context Text-to-SQL ⭐⭐⭐ 莱顿大学 & Microsoft, arXiv:2406.12692 一、论文速读 DIN-SQL 模型中使用了一个 self-correction 模块&#xff0c;他把 LLM 直接生成的 SQL 带上一些 guidelines 的 p…...

2024 年 8 款最佳建筑 3D 渲染软件

你现在使用的3D 渲染软件真得适合你吗&#xff1f; 在建筑和室内渲染当中&#xff0c;市面上有许多3D渲染软件可供选择。然而&#xff0c;并不是每款软件都适合你的需求。本指南将重点介绍2024年精选的8款最佳建筑3D渲染软件&#xff0c;帮助你了解不同的选项&#xff0c;并选…...

MAB规范(3):Chapter6 Glossary 术语表

第6章 - 术语表 此章不做过多的批注&#xff0c;都是些简单的术语解释。...

40python数据分析numpy基础之diag处理矩阵对角线元素

1 python数据分析numpy基础之diag处理矩阵对角线元素 python的numpy库的diag(v,k0)函数&#xff0c;以一维数组的形式返回方阵的对角线元素&#xff0c;或将一维数组转换为方阵&#xff08;非对角线元素为0&#xff09;。 方阵&#xff1a;方形矩阵&#xff0c;行数和列数相等…...

ffmpeg+nginx+video实现rtsp流转hls流,web页面播放

项目场景&#xff1a; 最近调试海康摄像头需要将rtsp流在html页面播放,因为不想去折腾推拉流&#xff0c;所以我选择ffmpeg转hls流&#xff0c;nginx转发&#xff0c;html直接访问就好了 1.首先要下载nginx和ffmpeg 附上下载地址&#xff1a; nginx nginx news ffmpeg htt…...

1、Redis系列-Redis高性能原理详解

Redis高性能原理详解 Redis是一款高性能的内存数据库&#xff0c;广泛应用于需要快速读写访问的数据密集型应用中。它的高性能得益于多方面的设计和优化。以下是Redis高性能实现的详细解释&#xff1a; 1. 单线程架构 Redis采用单线程架构来处理客户端请求&#xff0c;这与传…...

18.枚举

学习知识&#xff1a;枚举类型、相关的使用方法 Main.java&#xff1a; public class Main {public static void main(String[] args) {myenum[] colorlist myenum.values();//获取枚举中所有对象的引用数组for (myenum one : colorlist){System.out.println(one.toString(…...

全省高等职业学校大数据技术专业建设暨专业质量监测研讨活动顺利开展

6月21日&#xff0c;省教育评估院在四川邮电职业技术学院组织开展全省高等职业学校大数据技术专业建设暨专业质量监测研讨活动。省教育评估院副院长赖长春&#xff0c;四川邮电职业技术学院党委副书记、校长冯远洪&#xff0c;四川邮电职业技术学院党委委员、副校长程德杰等出席…...

2-16 基于matlab的动载荷简支梁模态分析程序

基于matlab的动载荷简支梁模态分析程序&#xff0c;可调节简支梁参数&#xff0c;包括截面宽、截面高、梁长度、截面惯性矩、弹性模量、密度。输出前四阶固有频率&#xff0c;任意时刻、位置的响应结果。程序已调通&#xff0c;可直接运行。 2-16 matlab 动载荷简支梁模态分析 …...

AI大模型的核心

前言 没错&#xff0c;AI大模型的核心成功因素通常可以归结为三大要素&#xff1a;大数据、大算力和强算法。这三个因素相辅相成&#xff0c;共同推动了现代人工智能技术的发展。 1. 大数据 • 定义&#xff1a;指的是涵盖广泛领域的海量数据&#xff0c;包括文本、图像、音…...

【Android面试八股文】ViewHolder为什么要被声明成静态内部类?

文章目录 ViewHolder为什么要被声明成静态内部类?1. 避免隐式引用导致的内存泄漏2. 提高性能3. 代码可读性和维护性实例代码总结ViewHolder为什么要被声明成静态内部类? 将 ViewHolder 声明为静态内部类有几个重要的原因,这样做可以提高性能并避免潜在的内存泄漏。下面是详…...

Android 11 系统OTA升级到旧版本(去除升级时间戳校验)

简介 由于客户要求能够通过OTA升级到旧版本因此探寻反向升级的方法。 方法一&#xff1a;进入recover模式 adb reboot recovery 点击Apply update from SD card 然后选择以前的OTA升级包就可以了。这种方式实测可以升级到旧的版本。但是我们的客户是通过在线升级软件进行更新…...

更新表的统计信息并清空缓存--DM8达梦数据库

更新表的统计信息并清空缓存--DM8达梦数据库 环境介绍1 收集 <表> 上所有对象信息&#xff0c;含索引2 清理缓存的执行计划3 达梦数据库学习使用列表 环境介绍 在某些环境刚完成数据迁移, 10万行以上大表数据量有修改1/3 ,查询条件已经创建索引,执行计划不好,或执行计划…...

【前后端实现】AHP权重计算

AHP权重计算&#xff1a; 需求&#xff1a;前端记录矩阵维度、上三角值&#xff0c;后端构建比较矩阵、计算权重值并将结果返回给前端 比较矩阵构建 如果你想要根据上三角&#xff08;不包括对角线&#xff09;的值来构建对称矩阵&#xff0c;那么你可以稍作修改上述的generate…...

K8S日常运维手册

Kubernetes&#xff08;简称 K8S&#xff09;是一种广泛使用的容器编排平台&#xff0c;能够自动化部署、扩展和管理容器化应用。对于运维人员来说&#xff0c;掌握 Kubernetes 的日常运维技能是确保系统稳定运行的关键。本文将介绍一些 Kubernetes 日常运维的基本操作与技巧&a…...

现在的Java面试都这么扯淡了吗?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;开发兼过半年面试官 刚开始…...

安全加固 MariaDB 和 MySQL 数据库

安全加固 MariaDB 和 MySQL 数据库 在今天的网络环境中&#xff0c;保护数据库安全至关重要&#xff0c;特别是像 MariaDB 和 MySQL 这样的流行数据库。本文将介绍一些关键的安全加固步骤&#xff0c;以确保数据库系统的安全性和稳定性。 1. 数据库版本和基础设置 首先&…...

OpenClaw错误处理:QwQ-32B生成有误时的自动修正方案

OpenClaw错误处理&#xff1a;QwQ-32B生成有误时的自动修正方案 1. 为什么需要关注大模型生成错误 上周我让OpenClaw自动整理项目文档时&#xff0c;遇到了一个令人哭笑不得的场景。QwQ-32B模型将"API响应时间优化"错误生成为"API响应时间恶化"&#xff…...

抖音批量下载工具:高效自动化内容采集解决方案

抖音批量下载工具&#xff1a;高效自动化内容采集解决方案 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在内容创作与数据分析领域&#xff0c;高效获取抖音视频资源是许多从业者面临的共同挑战。传统手动…...

面试官最爱问的归并排序:从递归到非递归,带你彻底搞懂边界条件与内存管理(避坑指南)

归并排序实战&#xff1a;从递归陷阱到非递归优化的工程级实现 在技术面试中&#xff0c;归并排序就像一位老练的考官&#xff0c;总能用各种边界条件挑战候选人的代码功底。我曾见过不少开发者能流畅写出递归版本&#xff0c;却在非递归实现中陷入无限循环&#xff1b;也有候选…...

SLAM Toolbox:从零开始掌握机器人自主定位与建图技术

SLAM Toolbox&#xff1a;从零开始掌握机器人自主定位与建图技术 【免费下载链接】slam_toolbox Slam Toolbox for lifelong mapping and localization in potentially massive maps with ROS 项目地址: https://gitcode.com/gh_mirrors/sl/slam_toolbox 在机器人技术飞…...

终极Luau面向对象编程指南:掌握类、继承和多态的实现技巧

终极Luau面向对象编程指南&#xff1a;掌握类、继承和多态的实现技巧 【免费下载链接】luau A fast, small, safe, gradually typed embeddable scripting language derived from Lua 项目地址: https://gitcode.com/gh_mirrors/lu/luau Luau是一种快速、小巧、安全、渐…...

LongCat动物百变秀快速入门:上传图片+输入文字=神奇效果

LongCat动物百变秀快速入门&#xff1a;上传图片输入文字神奇效果 1. 认识动物百变秀 你是否想过给家里的宠物猫换个造型&#xff1f;或者把普通的狗狗照片变成威风凛凛的狼&#xff1f;LongCat动物百变秀让这些想象变成现实。这是一个基于美团开源技术的智能图片编辑工具&am…...

5秒批量打开20个网页?这款效率工具让多任务处理快到飞起

5秒批量打开20个网页&#xff1f;这款效率工具让多任务处理快到飞起 【免费下载链接】Open-Multiple-URLs Browser extension for opening lists of URLs built on top of WebExtension with cross-browser support 项目地址: https://gitcode.com/gh_mirrors/op/Open-Multip…...

春联生成模型C盘清理关联技巧:释放AI模型存储空间

春联生成模型C盘清理关联技巧&#xff1a;释放AI模型存储空间 你是不是也遇到过这种情况&#xff1f;兴致勃勃地部署了几个不同的春联生成模型&#xff0c;想试试哪个写对联更有文采。结果玩了一圈下来&#xff0c;发现C盘空间告急&#xff0c;系统都开始卡顿了。看着那满屏的…...

Stable Yogi 模型 Java 开发实战:SpringBoot 微服务集成指南

Stable Yogi 模型 Java 开发实战&#xff1a;SpringBoot 微服务集成指南 最近在做一个智能客服项目&#xff0c;后端用的是 SpringBoot 微服务架构&#xff0c;需要集成一个图像理解模型来处理用户上传的截图。选型的时候&#xff0c;Stable Yogi 模型进入了我们的视野。它不仅…...

解锁B站视频资源:bilibili-parse解析工具全面应用指南

解锁B站视频资源&#xff1a;bilibili-parse解析工具全面应用指南 【免费下载链接】bilibili-parse bilibili Video API 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse bilibili-parse是一款基于PHP开发的Bilibili视频解析工具&#xff0c;为开发者提供简…...