POSIX信号量
目录
一、相关概念回顾
1.信号量
2.多线程使用资源的两种情况
3.P操作和V操作
二、CP && 基于环形队列的生产者消费者模型
1.环形队列的介绍
编辑
2.基于环形队列的生产者消费者模型的默认规则(通过信号量实现规则的成立)
3.相关的结论
4.单生产单消费的生产者消费者模型的实现思路
三、相关接口介绍
2.int sem_destroy(sem_t *sem);
3.int sem_wait(sem_t *sem);
4.int sem_post(sem_t *sem);
一、相关概念回顾
1.信号量
<1>作用:表明临界资源数量的多少
<2>本质
说法一:本质是一个计数器,是对特定资源的预定机制
说法二:信号量的本质也是临界资源
2.多线程使用资源的两种情况
<1>将目标资源整体使用【mutex 或 2元信号量】
<2>将目标资源按照不同的“块”,分批使用
3.P操作和V操作
<1>P操作本质是--,是原子的
<2>V操作本质是++,是原子的
二、CP && 基于环形队列的生产者消费者模型
1.环形队列的介绍
<1>环形队列为空时:head==tail
环形队列为满时:head==tail
<2>解决该冲突的方法
方法一:利用计数器count
方法二:空一个位置,让head==tail时为空,tail+1==head时为满
2.基于环形队列的生产者消费者模型的默认规则(通过信号量实现规则的成立)
<1>当为空时,只能让生产者先运行
<2>当为满时,只能让消费者先运行
<3>生产者不能把消费者套一个圈以上
<4>消费者不能超过生产者
3.相关的结论
<1>这要生产者和消费者不访问同一位置(即为空或为满时),他们两者就可同时运行
<2>为空:只能【互斥】生产者先【同步】运行
为满:只能【互斥】消费者先【同步】运行
<3>为空或为满时,生产者和消费者需要同步或互斥
4.单生产单消费的生产者消费者模型的实现思路
生产者Equeue() | 消费者Pop() |
资源:空的位置 | 有效数据 |
sem_blank=N | sem_data=0 |
int p_step=0 | int c_step=0 |
P(sem_blank);//sem_blank--(申请信号量) | P(sem_data);//sem_data--(申请信号量) |
在p_step处进行生产(生产) | 在c_step处进行消费(消费) |
p_step++;(更新下标) | c_step++;(更新下标) |
p_step%=N;(维持环形特性) | c_step%=N;(维持环形特性) |
V(sem_data);//sem_data++ | V(sem_blank);//sem_blank++ |
注:若要进行加锁,应该在申请信号量与生产/消费间进行加锁,在维持环形队列特性的操作后进行解锁
三、相关接口介绍
1.int sem_init(sem_t *sem, int pshared, unsigned int value);
<1>头文件:<semaphore.h>
<2>功能:初始化信号量
<3>参数:
sem:指向要要初始化信号量的指针
pshared:指定信号量是否在进程或线程之间共享
value:信号量的初始值(可用资源的数量)
<4>返回值:成功返回0,失败返回-1
2.int sem_destroy(sem_t *sem);
<1>头文件:<semaphore.h>
<2>功能:clean up an unnamed semaphore initialized with sem_init
<3>参数:sem:指向要要初始化信号量的指针
<4>返回值:成功返回0,失败返回-1
3.int sem_wait(sem_t *sem);
<1>头文件:<semaphore.h>
<2>功能:POSIX 线程库中用于操作信号量的函数,用于对信号量进行 P 操作,如果信号量的值大于零,sem_wait
会将其减一并立即返回;如果信号量的值为零,调用线程会阻塞,直到信号量的值变为正数。
<3>参数:sem:指向要要初始化信号量的指针
<4>返回值:成功返回0,失败返回-1
4.int sem_post(sem_t *sem);
<1>头文件:<semaphore.h>
<2>功能: POSIX 线程库中用于操作信号量的函数,用于对信号量进行 V 操作。它会增加信号量的值,如果有线程因等待该信号量而被阻塞,其中一个线程会被唤醒。
<3>参数:sem:指向要要初始化信号量的指针
<4>返回值:成功返回0,失败返回-1
相关文章:
POSIX信号量
目录 一、相关概念回顾 1.信号量 2.多线程使用资源的两种情况 3.P操作和V操作 二、CP && 基于环形队列的生产者消费者模型 1.环形队列的介绍 编辑 2.基于环形队列的生产者消费者模型的默认规则(通过信号量实现规则的成立) 3.相关的结论…...
前端Web开发HTML5+CSS3+移动web(基础-flex)
网页设计套路:从上到下,从整体到局部 1:HTML定义: (1)超文本是点击可以页面来回切换的链接 (2)标记就是标签语言 2:标签的语法 (1&…...
Java 原生异步编程与Spring 异步编程 详解
简介 Java 异步编程是现代高性能应用开发的核心技术之一,它允许程序在执行耗时操作(如网络请求、文件 IO)时不必阻塞主线程,从而提高系统吞吐量和响应性。 异步 vs 同步 同步:任务按顺序执行,后续任务需…...
AUTOSAR图解==>AUTOSAR_TR_HWTestManagementIntegrationGuide
AUTOSAR硬件测试管理集成指南 启动和关闭阶段硬件测试管理的规范与集成 目录 文档概述 1.1 文档范围 1.2 局限性目标与动机 2.1 目标 2.2 动机 2.3 用例约束与假设缩略语与术语相关文档HTMSS AUTOSAR集成方法HTMSS功能描述AUTOSAR架构解决方案 8.1 HTMSS系统架构 8.2 HTMSS启动…...
Day22 Kaggle泰坦尼克号训练实战
作业 自行学习参考如何使用kaggle平台,写下使用注意点,并对下述比赛提交代码 kaggle泰坦里克号人员生还预测 一、流程 思路概述 数据加载 :读取泰坦尼克号的训练集和测试集。数据预处理 :处理缺失值、对分类变量进行编码、…...
基于大核感知与非膨胀卷积的SPPF改进—融合UniRepLK的YOLOv8目标检测创新架构
在当前目标检测领域中,YOLO系列模型因其优异的速度-精度平衡能力而被广泛部署于工业界与科研场景。YOLOv8作为该系列的最新版本,在主干网络与特征金字塔结构上进行了多项优化,进一步提升了其实时性与鲁棒性。然而,其核心组件—SPP…...
[Linux]从零开始的STM32MP157 Busybox根文件系统构建
一、前言 在上一篇教程中,已经教了大家如何使用Buildroot构建根文件系统,并且在最后我们已经完整的构建了一个可以运行的根文件系统。但是,Buildroot的集成度太高了,不利于小白理解根文件系统,所以本次教程,…...
C++ RAII机制
RAII(Resource Acquisition Is Initialization)是一种编程范式,核心思想是:资源的生命周期与对象绑定——对象创建时获取资源,对象销毁时自动释放资源。这种机制通过构造函数和析构函数的配对执行,确保资源…...
spring中的@Value注解详解
一、核心功能与作用 Value是Spring框架中用于动态注入属性值的注解,支持从配置文件、环境变量、SpEL表达式等来源注入数据,实现代码与配置的解耦。 注入类型覆盖广泛 基本类型:字符串、数值(int/double)、布尔值等。 …...
模型欠拟合是什么?
模型的欠拟合:全面解析 一、定义与核心概念 欠拟合(Underfitting)是指模型在训练数据、验证数据和测试数据上均表现不佳的现象。其本质是模型过于简单或学习能力不足,无法捕捉数据中的潜在规律和复杂关系,导致泛化能力差。例如,用线性模型拟合非线性数据时,模型无法描…...
IC ATE集成电路测试学习——电流测试的原理和方法
电流测试 我们可以通过电流来判断芯片的工作状态时,首先先了解下芯片的电流是如何产生的。 静态电流 理论上,CMOS结构的芯片静态时几乎不耗电 CMOS基本结构:Pmos Nmos 串联当逻辑电平稳定时: ➜ 要么Pmos导通,Nmo…...
Wordpress头像无法加载太慢问题解决方式
Wordpress头像无法加载太慢问题解决方式 1、找到我们当前使用的主题目录中找到functions.php文件在文件最后面添加以下代码 if ( ! function_exists( get_cravatar_url ) ) {/***替换Gravatar头像为Cravatar头像** param string $url** return string*/function get_cravatar…...
《大模型微调实战:Llama 3.0全参数优化指南》
全参数微调(Full Parameter Fine-Tuning)是推动大模型适应垂直领域任务的核心技术,尤其对于Llama 3.0这类千亿级参数模型而言,其性能优化与场景适配能力直接决定了实际应用价值。然而,全参数微调面临计算成本高、内存占…...
ActiveMQ 生产环境问题排查与调优指南(二)
五、调优策略与实践 5.1 JVM 调优 JVM 调优对于提升 ActiveMQ 性能至关重要,合理的 JVM 配置可以使 ActiveMQ 更高效地利用系统资源,减少性能瓶颈。 设置合理的堆内存大小是 JVM 调优的关键步骤。堆内存是 JVM 中用于存储对象实例的区域,其…...
AugmentCode 非常昂贵的新定价
AugmentCode 现在的价格比 Cursor 和 Windsurf 的总和还要贵。 AugmentCode 曾是我开发工作流程的常用工具。出乎意料的是,他们改变了定价结构,让开发者们震惊不已。 原来的30 美元月费已经增长为50 美元月费,这是一个67%的增长。 改变我看法的不仅仅是价格上涨,还有他…...
Unity 红点系统
首先明确一个,即红点系统的数据结构是一颗树,并且红点的数据结构的初始化需要放在游戏的初始化中,之后再是对应的红点UI侧的注册,对应的红点UI在销毁时需要注销对红点UI的显示回调注册,但是不销毁数据侧的红点注册 - …...
Python-UV多环境管理
Python-UV多环境管理 Python使用UV进行环境管理,系统了解UV的使用 文章目录 Python-UV多环境管理 [toc]1-学习要点2-核心知识点3-UV多环境管理4-venv和uv脚本对比1-venv环境管理2-uv环境管理3-venv对比uv 1-学习要点 1-熟悉【UV环境管理】2-熟悉【UV和Venv脚本区别…...
多空短线决策+飞云分仓操盘,两个副图指标组合操盘技术,短线更精准有效
如上图,两个副图指标,第一个【短线多空决策】,第二个副图指标【飞云分仓操盘】,指标组合使用,精准性和有效性更加有效。 如上图,两个指标组合使用,我们选择第二个副图指标出现红色和紫色区域的标…...
istio in action之应用弹性与容错机制
在分布式系统中,服务间的依赖关系就像一张错综复杂的网络,任何一个节点的抖动都可能引发连锁反应。这也是为什么我们需要强调弹性,因为在分布式系统中,服务之间通过网络进行通信,这本身就引入了无数个潜在的失败点。我…...
将PyQt5设计的程序打包成.exe文件
打包教程 因为打包的机制是会把当前的解释器的包也打包上,而我的环境经常会有一些较大的包,比如torch之类的。所以这里会创建一个单独的环境。 conda create -n image_process python3.8 激活环境 conda activate image_process 现在先安装我需要安装…...
Java原生结合MQTTX---完成心跳对话(附带源码)
简言:✨当Java遇上MQTT:打造会"隔空传话"的魔法程序✨ 导语:想不想让两个Java程序像哈利波特里的双面镜一样实时对话?今天我们将用MQTT协议EMQX,在Ubuntu上搭建一个魔法邮局,再亲手编写会传信的…...
redis数据结构-06(LRANGE、LINDEX、LSET、LREM)
列表操作:LRANGE、LINDEX、LSET、LREM Redis 列表不仅仅是简单的数组;它们是一种强大的数据结构,可以高效地操作有序数据。本课将深入探讨使用 Redis 列表的四个基本命令: LRANGE 、 LINDEX 、 LSET 和 LREM 。掌握这些命令将使您…...
4.4 os模块
os模块: chdir:修改工作路径 --- 文件所在位置的标识 getcwd():返回当前路径,如果修改了则显示修改后的路径 curdir:获取当前目录的表示形式 cpu_count():返回当前cpu的线程数 getppid(): 获取当前进程编号 getppid():获取当前进程的父进…...
在 Windows 系统上选择与部署 DICOM 医学影像开发工具与库
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...
MYSQL数据库集群高可用和数据监控平台(详细版)
项目说明 概述 该项目共分为2个子项目,由MYSQL集群高可用和数据监控平台两部分组成 MYSQL集群高可用属于云原生高级课数据库运维部分的知识 数据监控平台属于云原生拔高项目,旨在让学生增加知识面,提高项目实习经历,充实简历 …...
学习通刷课稳定版(美化面板+完全免费)
学习通刷 (美化面板完全免费) 安装教程方法一源码文件 方法二 提示结尾 安装教程 方法一 我们首先在浏览器打开脚本猫网站并获取该插件(浏览器以Edge为例) 脚本猫首页:https://scriptcat.org/zh-CN/ 第一步ÿ…...
python 实现sha加密
在Python中,SHA(Secure Hash Algorithm)是一种加密哈希函数,通常用于生成数据的哈希值。SHA算法是单向的,这意味着它只能用于加密(生成哈希值),而不能用于解密。因此,SHA…...
Linux epoll 详解:概念、使用、数据结构、流程及应用
epoll是什么? epoll 是从 Linux 2.6 起,Linux内核提供的一种高性能I/O事件通知机制,用于解决传统 select 和 poll 在处理大量并发连接时遍历、最大数量限制、频繁拷贝数据等问题。epoll 可以用来监听多个文件描述符(socket、管道…...
Kubernetes排错(十一):lsof命令实战场景
在Kubernetes生产环境中,lsof作为Linux系统的"透视眼",是排查容器级疑难杂症的必备工具。本文将深入解析其在容器化场景下的高阶用法,助你快速定位隐藏问题。 一、基础环境准备 1. 容器内安装lsof # 临时进入容器安装࿰…...
Java基础语法之循环结构
循环结构 1.定义 控制一段代码重复执行多次 2.分类 2.1 for循环 2.1.1 定义 控制一段代码反复执行很多次。 2.1.2 for循环格式 for (初始化语句; 循环条件; 迭代语句) { 循环体语句(重复执行的代码); }示例 // 输出3次HelloWorld for (int i 0; i < 3; i) { System…...
冒泡排序的原理
冒泡排序是一种简单的排序算法,它通过重复地遍历待排序的列表,比较相邻的元素并交换它们的位置来实现排序。具体原理如下: 冒泡排序的基本思想 冒泡排序的核心思想是通过相邻元素的比较和交换,将较大的元素逐步“冒泡”到列表的…...
AUTOSAR图解==>AUTOSAR_TR_InteractionWithBehavioralModels
AUTOSAR与行为模型交互详解 深入解析AUTOSAR软件组件与行为模型的交互关系与转换机制 目录 引言 1.1 AUTOSAR编辑工具概述 1.2 源起与目标 1.3 术语定义需求追溯AUTOSAR中行为建模的用例 3.1 软件组件的行为建模 3.2 软件组件描述到行为模型 3.3 行为模型到软件组件描述 3.4 组…...
GO语言内存管理结构
文章目录 1、内存分区1.1、栈(Stack)1.2、堆(Heap) 2、堆内存管理结构2.1、内存分配器(MCache → MArena → MSpan → MHeap)2.2、大小分类(Size Class)2.3、分配流程 3、垃圾回收&a…...
分享一些资料供大家学习
群里收集来的,自己感觉还是比较经典的,希望大家喜欢!!! 20250428 夸克网盘分享一大波经典IT架构好货20250429夸克网盘分享精品文档-管理咨询师必备的思维模型20250430夸克网盘分享清华大学DeepSeek教程又来了《文科生A…...
RAGMCP基本原理说明和相关问题解惑
一、RAG架构原理和局限性 1.1 概念解释 RAG(Retrieval-Augmented Generation):检索增强生成,让大模型接受外部输入后,总结输出 向量数据库:向量数据通常是高维空间中的点,代表复杂的数据结构…...
PyGame游戏开发(含源码+演示视频+开结题报告+设计文档)
前言: 大二小学期python课上基于pygame做的一个游戏小demo,当时老师花了一天讲解了下python基础语法后(也是整个大学四年唯一学习python的时间),便让我们自学网课一周然后交项目,所以做的非常仓促ÿ…...
Git标签
Git标签 1. 添加标签 使用 tag 命令可以给某次 commit 提交的版本打上标签,相当于这个 commit id 的别名,在实践中,会使用 v1.0 之类的标签提示这是正式版的第一个版本。 git tag v1.0 [commit id]缺省输入 commit id会给最新的一次提交打…...
USB学习【6】USB传输错误的处理
1.前言 我们从物理层到信号层,到协议层,他们分别在不同的层面完成不同的功能。 总结一下: 物理层实现了高低电平的检测。 信号层更进一步,通过一些方法,实现了二进制的传输。 协议层,因为可以二进制传输了…...
深入解析 Vision Transformer (ViT) 与其在计算机视觉中的应用
在近年来,深度学习尤其在计算机视觉领域取得了巨大的进展,而 Vision Transformer(ViT)作为一种新的视觉模型,它的表现甚至在许多任务中超过了传统的卷积神经网络(CNN),如 ResNet。在…...
《Go小技巧易错点100例》第三十一篇
本期分享: 1.Go struct内存对齐 2.使用空结构体(struct{})节省内存 Go struct内存对齐 在计算机系统中,CPU 访问内存时并不是逐字节读取的,而是以特定大小的块(通常为 4/8 字节)为单位进行读取。当数据的内存地址正…...
全栈项目实战:Vue3+Node.js开发博客系统
全栈项目实战:Vue3Node.js开发博客系统 一、项目架构设计 1. 技术栈选型 前端技术栈: Vue 3 Composition APITypeScriptPinia状态管理Vue Router 4Element Plus UI组件库Vite构建工具 后端技术栈: Node.js (Express/Koa)MongoDB (Mong…...
查看YOLO版本的三种方法
查看YOLO版本的三种方法: 一、通过命令行直接查询 使用Python交互式查询: from ultralytics import __version__ print(__version__) # 示例输出: 11.0.5二、检查PyTorch环境兼容性 import torch, ultralytics print(f"PyTorch: {torch.__versi…...
基于Docker的Bitwarden的私有本地部署
基于Docker的Bitwarden的私有本地部署 文章目录 基于Docker的Bitwarden的私有本地部署 本文首发地址 https://h89.cn/archives/355.html bitwarden 默认连接的是国外服务器 https://bitwarden.com/ ,连接不是很稳定,也没有安全感,所以我选择了…...
点和体素哪个好
3D 深度学习中基于体素和基于点云的方法哪种更优?-腾讯云开发者社区-腾讯云 https://zhuanlan.zhihu.com/p/372497398 GitHub - open-mmlab/OpenPCDet: OpenPCDet Toolbox for LiDAR-based 3D Object Detection....
C++ STL编程 vector空间预留、vector高效删除、vector数据排序、vector代码练习
vector空间预留,作用是避免申请每次申请内存,提高运行效率。 对应的接口是 vector.reverse() vector的高效删除,对应的代码见下,一个时间复杂度是n,一个时间复杂度是1 #include<iostream> #include<vector…...
Android架构模式推荐及分析和MVC架构模式制作一个简单的底部tab切换
目录 主流架构模式对比 适用场景 MVP:团队协作开发,需要高可测试性的项目 MVC架构模式制作一个简单的底部tab切换 (Model-View-Controller)结构 代码 效果 主流架构模式对比 对比维度MVC MVP MVVM MVI 学习…...
【PVE】ProxmoxVE8虚拟机,存储管理(host磁盘扩容,qcow2/vmdk导入vm,vm磁盘导出与迁移等)
【PVE】ProxmoxVE8虚拟机,存储管理(host磁盘扩容,qcow2/vmdk导入vm,vm磁盘导出与迁移等) 文章目录 1、host 磁盘扩容2、qcow2/vmdk导入vm3、vm 磁盘导出与迁移 1、host 磁盘扩容 如何给host扩容磁盘,如增加…...
【JEECG 组件扩展】JSwitch开关组件扩展单个多选框样式
功能说明: 基于JeecgBoot开源框架,JSwitch开关组件扩展,支持单个多选样式。 效果展示: 使用示例: {field: JSwitch,component: JSwitch,label: JSwitch,},{field: JSwitchCheckBox,component: JSwitch,label: JSwitch…...
卷积神经网络-从零开始构建一个卷积神经网络
目录 一、什么是卷积神经网络CNN 1.1、核心概念 1.2、卷积层 二、什么是卷积计算 2.1、卷积计算的例子: 2.2、点积 2.3、卷积与点积的关系 2.4、Padding(填充) 2.4.1、Padding的主要作用 1、控制输出特征图尺寸 2、保留边缘信息 3. 支持深层网络训练 2.4.2、Str…...
Linux 常用命令集合
以下是一份 Linux 常用命令集合,涵盖文件操作、系统管理、网络管理、权限管理、进程管理等常见任务,并附上代码示例: 1. 文件与目录操作 命令作用示例ls列出目录内容ls -l(详细列表) ls -a(显示隐藏文件&a…...