前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >信号量

信号量

作者头像
lexingsen
发布于 2022-02-25 00:33:01
发布于 2022-02-25 00:33:01
4790
举报
文章被收录于专栏:乐行僧的博客乐行僧的博客

头文件:include <semaphore.h> 主要的函数:

1.初始化信号量 函数原型:int sem_init(sem_t* sem,int pshared,unsigned int value) 参数: sem:指定是哪一个信号量 pshared:指定信号量的类型,值为0表示是在当前进程使用的局部信号量,否则该信号量就可以在多个进程中共享。 value:指定信号量的初始值,可以理解为最多由多少个线程可以访问共享资源。 返回值:

2.销毁信号量 函数原型:int sem_destroy(sem_t* sem) 函数功能:释放信号量占用的内核资源,注意不能释放正在被线程其他等待的信号量,否则会出现错误。 返回值:

3.加锁 函数原型:int sem_wait(sem_t* sem) 函数功能:对信号量的值value进行-1操作,相当于p操作。如果value的值为0,会发生阻塞。

4.尝试加锁 函数原型:int sem_trywait(sem_t* sem) 函数功能:对信号量的值value进行-1操作,相当于p操作。如果value的值为0,会立即返回,不发生阻塞。

5.解锁 函数原型:int sem_post(sem_t* sem) 函数功能:对信号量的值value进行+1操作,相当于v操作。当信号量的值value大于0时,其他调用sem_wait()正在等待信号量的线程将被唤醒。

线程级信号量相对于互斥锁对于线程的控制尺度更大,在sem_init()第三个参数可以控制同时访问共享资源的线程的个数,通过这个参数,可以实现同步控制、互斥、以及阻塞。

比如两个线程协同工作,只有在一个工作线程完成对共享资源的访问操作之后,另外一个工作线程才可以对共享资源做访问。还有比如只有当事件发生后才能让线程开始工作,需要让线程在此之间处于阻塞的状态,一旦事件发生后,唤醒等待的线程即可开始工作。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【线程同步】信号量
信号量相当于进化版的互斥锁。由于互斥锁的粒度比较大,如果我们希望在多个线程间对某一对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住。这样虽然达到了多线程操作共享数据时保证数据正确性的目的,却无形中导致线程的并发性下降,线程从并行执行变成了串行执行,与直接使用单进程无异。信号量是相对折衷的一种处理方式,既能保证同步,数据不混乱,又能提高线程并发。
mindtechnist
2024/08/08
1640
【线程同步】信号量
Linux系统编程-(pthread)线程通信(信号量)
信号量的运用环境与互斥锁一样,但是信号量比互斥锁增加灵活,互斥锁只有两个状态(开锁和解锁),而信号量本质上是一个计数器,它内部有一个变量计数信号值,可以保护一个资源可以同时被1个或者2个或者3个线程同时使用,如果信号量的值只是设置1(状态只有0和1),那么和互斥锁就是一样的功能。
DS小龙哥
2022/02/17
2.6K0
线程同步(互斥锁与信号量的作用与区别)以及临界区临街资源
临界资源是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。属于临界资源的硬件有,打印机,磁带机等;软件有消息队列,变量,数组,缓冲区等。诸进程间采取互斥方式,实现对这种资源的共享。
zhangjiqun
2024/12/16
2370
线程同步(互斥锁与信号量的作用与区别)以及临界区临街资源
Linux线程编程之信号量
想必各位读者在看了昨天的文章分享之后,大概对线程有了一个比较清楚的认识了,但是昨天讲的东西过于纯理论化,所以在昨天的基础上,今天我们就来进行实战演练,做到活学活用,废话不多说,直接开干吧。
用户6280468
2022/03/21
1.7K0
【Linux】:多线程(POSIX 信号量 、基于环形队列的生产消费者模型)
🚀 POSIX信号量 和 SystemV信号量 作用相同,都是用于同步操作,达到无冲突的访问共享资源目的。 但POSIX可以用于线程间同步。
IsLand1314
2024/12/20
1530
【Linux】:多线程(POSIX 信号量 、基于环形队列的生产消费者模型)
【Linux探索学习】第三十一弹——线程互斥与同步(下):深入理解确保线程安全的机制
线程互斥与同步(上):【Linux探索学习】第三十弹——线程互斥与同步(上):深入理解线程保证安全的机制-CSDN博客
GG Bond1
2025/02/26
1220
【Linux探索学习】第三十一弹——线程互斥与同步(下):深入理解确保线程安全的机制
线程间同步的几种方式
信号量强调的是线程(或进程)间的同步:“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在sem_wait的时候,就阻塞在那里)。当信号量为单值信号量时,也可以完成一个资源的互斥访问。信号量测重于访问者对资源的有序访问,在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。
WindSun
2019/09/01
3.9K0
基于进程信号量的多线程同步机制研究与实现
信号量机制本质是对于资源的预订操作,线程或者进程预订了之后,确保未来有一段时间,资源是属于我的。
绝活蛋炒饭
2024/12/29
1500
详解Linux多线程中互斥锁、读写锁、自旋锁、条件变量、信号量
---- Hello、Hello大家好,我是木荣,今天我们继续来聊一聊Linux中多线程编程中的重要知识点,详细谈谈多线程中同步和互斥机制。 同步和互斥 互斥:多线程中互斥是指多个线程访问同一资源时同时只允许一个线程对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的; 同步:多线程同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源
Linux兵工厂
2023/02/28
3.8K0
详解Linux多线程中互斥锁、读写锁、自旋锁、条件变量、信号量
【Linux】生产消费模型实践 --- 基于信号量的环形队列
信号量本质是一个计数器,可以在初始化时对设置资源数量,进程 / 线程 可以获取信号量来对资源进行操作和结束操作可以释放信号量! 用于多进程 / 多线程 对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。 在资源只有一个时就一把互斥锁!
叫我龙翔
2024/08/22
1460
【Linux】生产消费模型实践 --- 基于信号量的环形队列
UNPv2第十章:Posix信号灯
信号灯、互斥锁和条件变量之间的差异:  互斥锁必须由给他上锁的线程解锁,信号灯的挂出不必由执行过它的等待操作的同一线程执行  互斥锁要么被锁住要么被解开  既然信号灯有一个与之相关连的状态(它的计数值),信号灯挂出操作总是被记住。然而当想一个条件变量发送信号时,如果没有线程等待在该条件变量上,那么该信号将丢失
提莫队长
2019/02/21
4390
Linux内核编程--信号量机制
信号量(semaphore)本质上是一个计数器,用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。 在信号量进行PV操作时都为原子操作(因为它需要保护临界资源)。
Coder-ZZ
2022/05/09
3K0
Linux内核编程--信号量机制
信号量与管程以及原子性,pv原语操作,临界资源和临界区,同步和互斥,信号量,管程与临界区不同,信号量和互斥锁的区别,互斥量(Mutex)
程序的原子性指:整个程序中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。
zhangjiqun
2024/12/16
1910
信号量与管程以及原子性,pv原语操作,临界资源和临界区,同步和互斥,信号量,管程与临界区不同,信号量和互斥锁的区别,互斥量(Mutex)
线程源码分析之信号量(基于linuxthreads2.0.1)
/* Semaphores a la POSIX 1003.1b */ #include "pthread.h" #include "semaphore.h" #include "internals.h" #include "restart.h" #ifndef HAS_COMPARE_AND_SWAP /* If we have no atomic compare and swap, fake it using an extra spinlock. */ #include "spinlock.h
theanarkh
2019/10/22
9470
【Linux】使用<信号量>实现<线程互斥>——(解析:用信号量实现两个线程互斥输出1-10数字)
YY的秘密代码小屋
2024/10/26
2140
【Linux】使用<信号量>实现<线程互斥>——(解析:用信号量实现两个线程互斥输出1-10数字)
【Linux】多线程 之 POSIX信号量
sem: 0 -> 1 -> 0 若临界资源只有1个,则sem设为1,当要使用临界资源时,sem由1变为0,其他人在想申请,则申请不到挂起排队,等待释放临界资源时 sem由0变为1 ,才可以再申请临界资源 这种信号量称为 二元信号量 ,等同于互斥锁
lovevivi
2023/10/17
4200
【Linux】多线程 之 POSIX信号量
线程(三)生产者消费者模型+POSIX信号量
生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。
海盗船长
2020/08/27
9070
Linux下多线程编程详解简介
上面的代码很简单,就是启动一个线程,然后先线程里循环打印字段字符串。我们就以这个最简单的例子来开口。
用户2929716
2018/08/23
4.3K0
基于信号量和环形队列的生产者消费者模型
POSIX信号量和SystemV信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源目的。 但POSIX可以用于线程间同步。信号量的本质是一个计数器。
南桥
2024/08/29
890
基于信号量和环形队列的生产者消费者模型
信号量控制线程顺序
答案是用信号量,当然是在线程不多的情况,每个线程分配一个信号量,然后在前面的线程先获取自己的信号量,结束后释放下一个线程的信号量,从而达到有序
opencode
2022/12/26
4540
推荐阅读
相关推荐
【线程同步】信号量
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档