当前位置: 首页 > 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. 数据库版本和基础设置 首先&…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...

Pydantic + Function Calling的结合

1、Pydantic Pydantic 是一个 Python 库&#xff0c;用于数据验证和设置管理&#xff0c;通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发&#xff08;如 FastAPI&#xff09;、配置管理和数据解析&#xff0c;核心功能包括&#xff1a; 数据验证&#xff1a;通过…...

简约商务通用宣传年终总结12套PPT模版分享

IOS风格企业宣传PPT模版&#xff0c;年终工作总结PPT模版&#xff0c;简约精致扁平化商务通用动画PPT模版&#xff0c;素雅商务PPT模版 简约商务通用宣传年终总结12套PPT模版分享:商务通用年终总结类PPT模版https://pan.quark.cn/s/ece1e252d7df...

vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能

vxe-table vue 表格复选框多选数据&#xff0c;实现快捷键 Shift 批量选择功能 查看官网&#xff1a;https://vxetable.cn 效果 代码 通过 checkbox-config.isShift 启用批量选中,启用后按住快捷键和鼠标批量选取 <template><div><vxe-grid v-bind"gri…...