linux下信号量semaphore的应用

Linux 信号(Signal)与信号量(Semaphore)深度辨析:从机制到应用的3个核心差异 本文深入解析Linux系统中信号(Signal)与信号量(Semaphore)的3个核心差异,包括异步通知与同步控制的本质区别、内核处理与用户态操作的实现机制,以及典型误用场景与正确实践。通过代码示例展示二者在进程间通信中的应用,帮助开发者准确理解并正确使用这两种关键机制。 阅读详情

 

http://www.yuanma.org/data/2006/0721/article_1195.htm



生产者线程用于往链表里添加节点,数个工作线程从链表取出节点并处理。对于一般的mutex_lock,mutex_unlock方式,如果这一段时间没有工作,那么工作线程将会不停的调用lock,unlock操作。而这样的操作毫无疑义。

 

在这里系统给我们提供了另外一种同步机制,信号灯,Semaphore。

信号灯其实就是一个计数器,也是一个整数。每一次调用wait操作将会使semaphore值减一,而如果semaphore值已经为0,则wait操作将会阻塞。每一次调用post操作将会使semaphore值加一。将这些操作用到上面的问题中。工作线程每一次调用wait操作,如果此时链表中没有节点,则工作线程将会阻塞,直到链表中有节点。生产者线程在每次往链表中添加节点后调用post操作,信号灯值会加一。这样阻塞的工作线程就会停止阻塞,继续往下执行。

信号灯的类型为sem_t。在声明后必须调用sem_init()。需要传递两个参数,第一个参数就是你之前声明的sem_t变量,第二个必须为0。当你不再需要信号灯时,你必须调用sem_destroy()来释放资源。

等待信号灯的操作为sem_wait()。投递一个信号的操作为sem_wait()。和互斥量一样,等待信号灯也有一个非阻塞的操作,sem_trywait()。该操作在没有信号灯的时候返回EAGAIN。

下面是一个结合了互斥量和信号灯的例子:

 

 


 

Linux下信号量的学习使用 还是举个电话亭的例子: 现在小区楼下公共电话亭,一次肯定只能进去一个人打电话,现在有A,B两个人要打电话,此时电话亭里面A正在打电话,相当于获取到了信号量.B要等A打完电话后才能进去打电话,B要么在电话亭门口一直等着A出来,这个时候相当于自旋锁。 阅读详情

相关推荐

Linux复习: semaphore.h信号量和生产者消费者

点击查看demo代码 demo运行结果如图 借用网上的一段话 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这种生产消费能力不均衡的问题,所以便有了生产者和消费者模式。 可以对数...

编程爱好者的博客 5932

[linux下]理解Semaphore及其用法详解

2009-05-12 13:13 Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个。一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行。 Semaphore是一件可以容纳N人的房间,如果人不满就可以进去,如果人满了,就要等待有人出来。对于N=1的情况,称为binary semapho

jack_incredible的专栏 1万+

Linux 内核 semaphore(信号量)机制详解

Linux信号量机制是操作系统实现并发控制的重要工具,主要用于资源计数、进程同步和互斥访问。内核通过struct semaphore结构体实现计数信号量,包含计数器count、自旋锁lock和等待队列wait_list。核心操作包括down(获取资源)和up(释放资源),支持阻塞、中断、超时等多种获取方式。信号量适用于生产者-消费者模型、资源池管理等场景,但与互斥锁相比性能较低且无持有者概念。使用时应合理初始化计数值,优先选择可中断版本,并注意避免在原子上下文调用阻塞操作。对于纯互斥场景推荐使用mutex,

图形/计算GPU的驱动与虚拟化技术分享园地 1261

Semaphore应用场景

应用场景 Semaphore可以用来做流量分流,特别是对公共资源有限的场景,比如数据库连接。 假设有这个的需求,读取几万个文件的数据到数据库中,由于文件读取是IO密集型任务,可以启动几十个线程并发读取,但是数据库连接数只有10个,这时就必须控制最多只有10个线程能够拿到数据库连接进行操作。这个时候,就可以使用Semaphore做流量控制。 public class SemaphoreTest...

luzhensmart的专栏 910

5G初始注册流程详解(2)-Registration Request

1:了解注册的本质,5G终端为什么要注册? 2:SUCI,SUPI,5G-GUTI的区别? 3:为什么会有COMPLETE REGISTRATION REQUEST呢?

weixin_53220301的博客 3794

5个IO口驱动188数码管:查理复用算法在TM52F1363上的极致应用

本文深入解析了如何利用查理复用算法,在TM52F1363单片机上仅用5个IO口驱动188数码管。通过精密的硬件连接与软件时序控制,结合高阻态和动态扫描策略,实现了在极致资源限制下的稳定显示,为成本敏感型嵌入式产品提供了高效的IO复用解决方案。

numpy6sculptor的博客 478

Semaphore基本方法与应用场景实例

本章主要对Semaphore进行学习。 1.Semaphore简介 Semaphore,是JDK1.5的java.util.concurrent并发包中提供的一个并发工具类。 所谓Semaphore即 信号量 的意思。 这个叫法并不能很好地表示它的作用,更形象的说法应该是许可证管理器。 其作用在JDK注释中是这样描述的: A counting semaphore.  Conceptual...

luoyeyeyu的专栏 1240

VMware Workstation Pro 16 安装 Ubuntu 20.04

VMware Workstation Pro 16 安装 ubuntu 20.04目录环境VMware Workstation下载Ubuntu 20.04下载安装过程 目录 环境 Windows 10 Workstation 16 Pro for Windows Ubuntu 20.04 LTS 64位 desktop版本 VMware Workstation下载 链接: https://www.vmware.com/products/workstation-pro/workstation-pro-eval

qq_45642410的博客 1万+

linux c 下关于semaphore的使用

#include #include #include #include #include #include #include union semun { int val; struct semid_ds *buf; unsigned short int *array; struct seminfo *__buf; };

EvoShark的专栏 1301

从IMC层到应力点:手把手教你用SEM/EDS给BGA焊点做一次‘体检’

本文详细介绍了如何使用SEM/EDS技术对BGA焊点进行全面失效分析,从样品制备到SEM观察、EDS分析,再到综合诊断,手把手教你识别焊点的微观特征和成分异常。文章特别强调了IMC层分析在BGA焊接失效诊断中的关键作用,并提供了实用的实验室技巧和常见失效模式对照表,帮助工程师快速定位问题根源。

weixin_42685438的博客 384

PHM算法与智能分析技术

PHM概述

柳杰的博客 1万+

进程间通信IPC-信号量Semaphore

信号量是一个很有趣的系统同步方式,在linux下和windows下都有支持。它像是为典型的生产者消费者问题应运而生的。

春夜喜雨的专栏 1231

【推荐100个unity插件】unity实现交互式火焰 —— Ignis

Ignis是一款Unity互动式消防系统插件,可轻松将物体转换为可燃物。支持固体、植被、蒙皮网格和地形树木等多种对象类型,提供火焰蔓延、熄灭等效果。安装需通过Unity Package Manager添加Visual Effects Graph,并按照指引转换目标物体材质。使用盒型碰撞体或网格计算燃烧区域,可自定义火焰参数和视觉效果。内置多种转换选项,如Flammable Vegetation、Flammable Skinned Mesh等,适用于不同场景需求。注意使用前需备份材质和地形数据,并提供性能优化

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2239

C++20 semaphore(信号量) 详解

/ 用初始计数为1初始化一个信号量std::counting_semaphore是一种允许指定数量的线程同时访问资源的信号量。在这个例子中,一次只有一个线程可以访问由sem保护的资源。

一枚菜鸡 7459

【3D无序抓取】--终极技术详解

3D无序抓取技术详解:从感知到执行的全流程技术方案 本文系统梳理了3D无序抓取(Bin Picking)的核心技术栈,涵盖3D感知、抓取规划和机器人执行三大环节。在3D感知层,详细介绍了点云采集与预处理方法(PCL/Open3D)、物体分割(PointNet++)和位姿估计(PVN3D/DenseFusion)等关键技术。抓取规划部分重点解析了抓取生成(GraspNet)、质量评估(Dex-Net)和动态避障(MoveIt!)算法。机器人执行环节则涉及路径规划、力控技术和末端执行器选型。同时提供了完整的工具

weixin_45590420的博客 598

研制过程评审活动(三)工程研制阶段

工程研制阶段主要任务、及评审活动

Abel的博客 2388

semaphore信号量

semaphore也就是信号量,是一种进程见同步机制,我们可以作为互斥量来保护临界区资源,但是作为一种同步机制,还能怎么用呢?当然我们可以做进程间的同步使用,比如进程A和进程B,如果进程A要等待进程B完成某项工作后才能继续运行,那么可以使用信号量来操作,进程A先对一个信号量进行P操作(减少),然后运行到特定的地方再次尝试去P操作(减少),如果是普通的锁,此时就已经死锁了,因为锁的获取与释放只能由同...

程序猿Ricky的日常干货 780

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

信号量 semaphore

信号量(semaphore)   Linux内核的信号量在概念和原理上与用户态的System V的IPC机制信号量是一样的,但是它绝不可能在内核之外使用,因此它与System V的IPC机制信号量毫不相干。   信号量在创建时需要设置一个初始值,表示同时可以有几个任务可以访问该信号量保护的共享资源,初始值为1就变成互斥锁(Mutex),即同时只能有一个任务可以访问信号量保护的共享资源。

kingjo002的专栏 1564

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

linux 多进程 posix semaphore 二值,Linux互斥与同步应用(4):posix信号量的互斥与同步...

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;......pthread_mutex_lock(&mutex);//加锁....../*share memory handle*/......pthread_mutex_unlock(&mutex);//解锁......现在我们也使用类似方式来实现:sem_t *sem_m...

weixin_42505252的博客 299

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

linux sem信号量使用

Linux下关于信号量结构体表示为:sem_t       操作结构体的函数:       初始化函数: sem_init(sem_t * __sem,int __pshared,unsigned int __value);       触发信号量值:sem_post(sem_t * __sem);       等待信号量触发:       通常有:

linhai0819的专栏 2万+

Linux进程间的通信之信号量

信号量 在创建子进程后,究竟是父进程还是子进程先运行这由操作系统调度策略决定,而如果要保证父子进程执行的先后顺序呢?我们可以使用sleep函数使得父子进行按照我们预想的顺序进行执行。但是要向我们那样使用sleep()函数,只能保证先执行子进程,但是不能保证子进程执行完后再执行父进程。所以如果我们想要子进程完全 执行完后再执行父进程,就可以利用信号量(Semaphore)来解决它们之间的同...

Tian Jincheng's Blog 717

同步---信号量

信号量1 信号量2 驱动程序和测试程序3 内核的具体实现 1 信号量 Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已经被占用的信号量时,信号量会将其放到一个等待队列,然后让其睡眠,这时处理器去执行其他代码。当持有信号量的进程将信号量释放后,处于等待队列中的那个任务将被唤醒,并获得该信号量。 信号量定义在文件include/linux/semaphore.h中 /* Please don't access any members of this structure directly */ st

qq_41683305的博客 2478

linux并发控制之信号量

信号量(semaphore)是用于保护临界区的一种常用方法,它的使用方式与自旋锁类似 与自旋锁相同的是:只有得到信号量的进程才能执行临界区的代码 与自旋锁不同的是:当获取不到信号量的时候,进程不会在原地打转,而是进入休眠等待状态; 理解: 定义于#include<linux/semaphore.h> struct semaphore { spinlock_t ...

weixin_34267123的博客 90

第7章 Linux并发控制-信号量

7.6 信号量信号量(Semaphore)是操作系统中最典型的用于同步和互斥的手段,信号量的值可以是0、1或者n。信号量与操作系统中的经典概念PV操作对应。P(S):①将信号量S的值减1,即S=S-1;②如果S≥0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。V(S):①将信号量S的值加1,即S=S+1;②如果S&gt;0,唤醒队列中等待信号量的进程。Linux中与信号量相关的操作主要...

xiezhi123456的博客 323
上一篇: Linux内核的ioctl函数学习2 - linux系统ioctl使用示例
下一篇: Gnome 3.x快捷键总结
dos5gw
博客等级 码龄17年 48粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值