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

Linux--信号量详解

目录

一、信号量

1、信号量相关函数

2、多线程环形队列生产消费模型

3、实现代码


信号量是将整体的资源分割成多份使用
信号量本质是对资源的预定机制

一、信号量

1、信号量相关函数

  1. 创建信号量sem_init:

    • int sem_init(sem_t *sem, int pshared, unsigned int value);
    • 返回值: 成功时返回0,失败时返回-1。
    • 参数:
      • sem: 指向信号量对象的指针。
      • pshared: 如果为0,信号量在进程间不共享;如果为非零值,信号量在进程间共享。
      • value: 初始化信号量的值。
  1. 销毁信号量:sem_destroy:

    • int sem_destroy(sem_t *sem);
    • 返回值: 成功时返回0,失败时返回-1。
    • 参数sem: 指向信号量对象的指针。
  2. 等待信号量sem_wait:

    • int sem_wait(sem_t *sem);
    • 返回值: 成功时返回0,失败时返回-1。
    • 参数:sem: 指向信号量对象的指针。
  3. 增加信号量sem_post:

    • int sem_post(sem_t *sem);
    • 返回值: 成功时返回0,失败时返回-1。
    • 参数sem: 指向信号量对象的指针。

2、多线程环形队列生产消费模型

1、队列空,生产者先进
2、队列满,消费者先进
在局部公共资源有一定的顺序
3、队列不为空且也不为满:允许生产和消费同时进行
上述过程体现线程的局部互斥和整体的同步
不能让消费者超过生产者
生产者也不能超过消费者
怎么做到上述这一点?
信号量
对消费者来说,只关注数据资源
对生产者来说,只关注空间资源
于是我们可以初始化各自的信号量分别为0和N
sem_t space_sem = N;
sem_t data_sem = 0;

于是,我们有两个逻辑:

生产者
P(space_sem)//申请空间信号量,空间资源-1
//生产逻辑
V(data_sem)//生产完毕,数据资源+1

消费者
P(data_sem)//申请数据信号量空间资源-1
//消费逻辑
V(space_sem)//消费完毕,空间资源+1

上述两个逻辑就已经能够实现我们基本的生产消费逻辑
为什么?
当时队列为空时,要满足生产者先进
此时,空间资源为N,数据资源为0
即使消费和生产线程同时进,但是因为没有数据,消费线程无法申请信号量,于是阻塞
当队列满时,要满足消费者先进
此时,因为空间资源为0,因此生产者无法申请到信号量,于是阻塞
而当队列不为空不为满时,生产者和消费者都能进
于是,上述的伪代码设计,就能够实现了基本的生产消费模型
实现局部互斥和整体的同步

单生产->多生产
如何修改代码?
此时要考虑多个线程可能会同时访问一个资源
所以要处理多线程之间互斥的关系
因此,解决互斥,要加锁
加几把锁?
两把
为什么?
因为只有生产者之间会竞争数据资源
只有消费者之间会竞争空间资源

现在考虑一个问题:
先申请信号量好还是先加锁好?
如果先加锁
那么,当前线程是进来了,加完锁,再申请信号量
没毛病
但是其他线程呢?
其他线程只能干等着,什么也干不了,阻塞在锁那里,因为锁被人家用了
此时,影响执行速度的,有申请锁 和 申请信号量两个因素
但是如果先申请信号量
那么所有的线程手里都有一个信号量资源
再去抢锁
于是,上一个线程用完锁,下一个立马就直接上锁了
不用再重新申请信号量了
于是,此时限制执行速度的,只有申请锁这个因素
因为已经事先申请了信号量
类似于缓存的机制
因此,先申请信号量的效率要高一些

现在,再次思考一个问题:
单线程的单生产单消费模型 和 多线程 的多生产多消费模型
二者之间的效率,后者真的比前者更高吗?
按道理来说是的
但是,你仔细思考,真的吗?
多线程是要加锁的
为什么加锁?
防止线程竞争互斥现象
就是同一个时间,只能有一个线程在执行,其他线程只能干等着。
什么??????
多线程在同一时间也只能有一个线程在消费数据 / 生产数据
也就是说,多线程在本质上也是串行执行的
那这和单线程的运行有什么区别呢?
单线程也只是串行,多线程也是串行
你搁这隔这呢?
所以,多线程的意义在哪?看着比较叼?
非也,非也
我们说线程互斥,同一个时间只能执行一个,没问题
但是我们可没说同一时间只能创建一个线程
也没有说同一时间只能有一个线程在处理数据
我们所说的线程互斥,是什么时候互斥?在哪里互斥?
这个问题要搞清楚
是在访问共享资源的时候互斥!其他时刻 和 位置并不互斥,互不影响
只能有一个线程在访问 / 获取 共享资源
在这一点,多线程和单线程是一样的
但是,事实上,对于一个程序的执行来说,对资源的访问 / 获取 消耗是很小的
大部分的消耗是什么呢?
是数据的创建 和 数据的处理
而对多线程来说
对于没有访问共享资源的线程
他就可以进行数据的创建 和 数据的处理
这就实现了一定意义的执行同步,即所谓的并发
于是,对于单线程来说
执行速度取决于数据的创建、数据的处理 和 资源的访问 / 获取
但是对于多线程来说
执行速度,仅仅取决于资源的访问  / 获取
因为数据的创建 和 数据的处理 是可以和资源的访问 / 获取并发的
这就是多线程并发的真正核心
也是多线程对于单线程的优势和意义

同时,在上述代码中,你会发现
在申请信号量时,并不需要判断是否满足条件,即是否有资源
而是直接申请
为什么?
因为信号量本质是一个资源计数器
通过资源技术器就可以让外部直接知道资源的有无
而无需判断

3、实现代码

相关文章:

Linux--信号量详解

目录 一、信号量 1、信号量相关函数 2、多线程环形队列生产消费模型 3、实现代码 信号量是将整体的资源分割成多份使用 信号量本质是对资源的预定机制 一、信号量 1、信号量相关函数 创建信号量: sem_init: int sem_init(sem_t *sem, int pshared, unsigned int value); …...

【重学 MySQL】五十一、更新和删除数据

【重学 MySQL】五十一、更新和删除数据 更新数据删除数据注意事项 在MySQL中,更新和删除数据是数据库管理的基本操作。 更新数据 为了更新(修改)表中的数据,可使用UPDATE语句。UPDATE语句的基本语法如下: UPDATE ta…...

Web3与人工智能的交叉应用探索

随着数字技术的发展,Web3与人工智能(AI)之间的结合正逐渐成为一个重要的研究领域。Web3技术旨在实现更加去中心化和透明的互联网,而人工智能则在数据分析、自动化决策和增强人类能力方面展示了巨大的潜力。 1. 去中心化数据管理与…...

【springboot9736】基于springboot+vue的逍遥大药房管理系统

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 项目描述 伴随着全球信息化发展,行行业业都与计算机技…...

四.网络层(上)

目录 4.1网络层功能概述 4.2 SDN基本概念 4.3 路由算法与路由协议 4.3.1什么是路由协议? 4.3.2什么是路由算法? 4.3.3路由算法分类 (1)静态路由算法 (2)动态路由算法 ①全局性 OSPF协议与链路状态算法 ②分散性 RIP协议与距离向量算法 4.3.…...

Leecode热题100-56.合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入:intervals [[1,3…...

安全帽未佩戴预警系统 劳保防护用品穿戴监测系统 YOLO

在建筑、矿山、电力等高危行业中,工人面临着各种潜在的危险,如高空坠物、物体打击等。安全帽能够有效地分散和吸收冲击力,大大降低头部受伤的严重程度。一旦工人未正确佩戴安全帽,在遭遇危险时,头部将直接暴露在危险之…...

【python机器学习】线性回归 拟合 欠拟合与过拟合 以及波士顿房价预估案例

文章目录 线性回归之波士顿房价预测案例 欠拟合与过拟合线性回归API 介绍:波士顿房价预测数据属性:机器学习代码实现 拟合 过拟合 欠拟合 模拟 及处理方法(正则化处理)导包定义函数表示欠拟合定义函数表示拟合定义函数表示过拟合 正则化处理过拟合L1正则化L2正则化 线性回归之波…...

IT招聘乱象的全面分析

近年来,IT行业的招聘要求似乎越来越苛刻,甚至有些不切实际。许多企业在招聘时,不仅要求前端工程师具备UI设计能力,还希望后端工程师精通K8S服务器运维,更有甚至希望研发经理掌握所有前后端框架和最新开发技术。这种招聘…...

一入递归深似海,算法之美无止境

最近在刷leetcode hot100,在写二叉树中最大路径和的时候,看到了一个佬对递归的理解,深受启发,感觉自己对于递归的题又行了!!! 这里给大家分享一下(建立大家先去尝试一下这道题再来看 124. 二叉树中的最大路径和 二叉树中的 路径 被定义为一条节点序列,序列中每…...

进程的状态的理解(概念+Linux)

文章目录 进程的状态并行和并发物理和逻辑 时间片进程具有独立性等待的本质运行阻塞标记挂起等待 Linux下的进程状态(一)运行状态(R - running)(二)睡眠状态(S - sleeping)&#xff…...

Apache Linkis + OceanBase:如何提升数据分析效率

计算中间件 Apache Linkis 构建了一个计算中间件层,以实现上层应用程序和底层数据引擎之间的连接、治理和编排。目前,已经支持通过数据源的功能,实现用户通过Linkis 对接并使用 OceanBase数据库。 本文详细阐述了在 Apache Linkis v1.3.2中&a…...

Day01-postgresql数据库基础入门培训

Day01-postgresql数据库基础入门培训 1、PostgresQL数据库简介2、PostgreSQL行业生态应用3、PostgreSQL版本发展与特性4、PostgreSQL体系结构介绍5、PostgreSQL与MySQL的区别6、PostgreSQL与Oracle、MySQL的对比 1、PostgresQL数据库简介 PostgreSQL【简称:PG】是加…...

打卡第四天 P1081 [NOIP2012 提高组] 开车旅行

今天是我打卡第四天,做个省选/NOI−题吧(#^.^#) 原题链接:[NOIP2012 提高组] 开车旅行 - 洛谷 题目描述 输入格式 输出格式 输入输出样例 输入 #1 4 2 3 1 4 3 4 1 3 2 3 3 3 4 3 输出 #1 1 1 1 2 0 0 0 0 0 输入 #2 10 4 5 6 1 …...

Jenkins Pipline流水线

提到 CI 工具,首先想到的就是“CI 界”的大佬--]enkjns,虽然在云原生爆发的年代,蹦出来了很多云原生的 CI 工具,但是都不足以撼动 Jenkins 的地位。在企业中对于持续集成、持续部署的需求非常多,并且也会经常有-些比较复杂的需求,此时新生的 CI 工具不足以支撑这些很…...

鸿蒙harmonyos next flutter混合开发之开发FFI plugin

创建FFI plugin summation,默认创建的FFI plugin是求两个数的和 flutter create --templateplugin_ffi summation --platformsandroid,ios,ohos 创建my_application flutter create --org com.example my_application 在my_application项目中文件pubspec.yaml引…...

oracle数据库安装和配置

Oracle数据库安装 一、安装前的准备 系统要求: 硬件:内存至少1GB(推荐2GB以上),硬盘至少10GB的可用空间,CPU至少2核心。 操作系统:支持Oracle版本的Windows(如Windows 10或更高版本…...

猫玖破密啦

题目: 终究还是猫哥:3d5a3a0cfff7fb2e29194c0b7a89f284ff19a8 玖离:收到消息Oh,what_is_the_flag 玖离:7468655f666c61675f69735f666c13556d2cf2faec1e2d0f330b7dcceea1c62cb2 终究还是猫哥:收到消息************************************ 已…...

SpringBoot框架:服装生产管理的现代化工具

摘 要 本协力服装厂服装生产管理系统设计目标是实现协力服装厂服装生产的信息化管理,提高管理效率,使得协力服装厂服装生产管理作规范化、科学化、高效化。 本文重点阐述了协力服装厂服装生产管理系统的开发过程,以实际运用为开发背景&#…...

Android Preference的使用以及解析

简单使用 values.arrays.xml <?xml version"1.0" encoding"utf-8"?> <resources><string-array name"list_entries"><item>Option 1</item><item>Option 2</item><item>Option 3</item&…...

HCIP——GRE和MGRE

目录 VPN GRE GRE环境的搭建 GRE的报文结构 GRE封装和解封装报文的过程 GRE配置​编辑 R1 R2 GRE实验​​​​​​​​编辑 MGRE 原理 MGRE的配置 R1 R2 R3 R4 查看映射表 抓包 MGRE环境下的RIP网络 综合练习​编辑 VPN 说到GRE&#xff0c;我们先来说个大…...

微信小程序——音乐播放器

一、界面设计 播放页面&#xff1a; 显示当前播放歌曲的封面图片、歌曲名称、歌手名称。有播放 / 暂停按钮、上一首、下一首按钮。进度条显示播放进度&#xff0c;可以拖动进度条调整播放位置。音量调节滑块。 歌曲列表页面&#xff1a; 展示歌曲列表&#xff0c;包括歌曲名称、…...

OceanBase 4.x 部署实践:如何从单机扩展至分布式部署

OceanBase 4.x 版本支持2种部署模式&#xff1a;单机部署与分布式部署&#xff0c;同时支持从单机平滑扩展至分布式架构。这样&#xff0c;可以有效解决小型业务向大型业务转型时面临的扩展难题&#xff0c;降低了机器资源的成本。 以下将详述如何通过命令行&#xff0c;实现集…...

大数据新视界 --大数据大厂之TeZ 大数据计算框架实战:高效处理大规模数据

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

docker详解介绍+基础操作 (三)

1.docker 存储引擎 Overlay&#xff1a; 一种Union FS文件系统&#xff0c;Linux 内核3.18后支持 Overlay2&#xff1a;Overlay的升级版&#xff0c;docker的默认存储引擎&#xff0c;需要磁盘分区支持d-type功能&#xff0c;因此需要系统磁盘的额外支持。 关于 d-type 传送…...

【大语言模型-论文精读】谷歌-BERT:用于语言理解的预训练深度双向Transformers

【大语言模型-论文精读】谷歌-BERT&#xff1a;用于语言理解的预训练深度双向Transformers 目录 文章目录 【大语言模型-论文精读】谷歌-BERT&#xff1a;用于语言理解的预训练深度双向Transformers目录0. 引言1. 简介2 相关工作2.1 基于特征的无监督方法2.2 无监督微调方法2.3…...

【Java】集合中单列集合详解(一):Collection与List

目录 引言 一、Collection接口 1.1 主要方法 1.1.1 添加元素 1.1.2 删除元素 1.1.3 清空元素 1.1.4 判断元素是否存在 1.1.5 判断是否为空 1.1.6 求取元素个数 1.2 遍历方法 1.2.1 迭代器遍历 1.2.2 增强for遍历 1.2.3 Lambda表达式遍历 1.2.4 应用场景 二、…...

【Fine-Tuning】大模型微调理论及方法, PytorchHuggingFace微调实战

Fine-Tuning: 大模型微调理论及方法, Pytorch&HuggingFace微调实战 文章目录 Fine-Tuning: 大模型微调理论及方法, Pytorch&HuggingFace微调实战1. 什么是微调(1) 为什么要进行微调(2) 经典简单例子&#xff1a;情感分析任务背景微调 (3) 为什么微调work, 理论解释下 2…...

清华系“仓颉”来袭:图形起源:用AI颠覆字体设计,推动大模型商业化落地

大模型如何落地&#xff1f;又该如何实现商业化&#xff1f;这一议题已成为今年科技领域的焦点话题。 在一个鲜为人知的字体设计赛道上&#xff0c;清华创业公司“图形起源”悄然实现了商业变现&#xff1a;他们帮助字体公司将成本降低了80%&#xff0c;生产速度提升了10倍以上…...

分布式一致性协议的深度解析:Paxos与Raft

分布式系统的复杂性源于节点失效、网络分区、消息丢失等诸多不确定性。在这种背景下&#xff0c;分布式一致性问题应运而生&#xff0c;成为解决这些问题的核心。本文将从理论到实践&#xff0c;深入探讨两种经典的一致性协议&#xff1a;Paxos与Raft。文章适合有一定分布式系统…...