信号量的概念 及其 操作函数(有名、无名信号量)

本文详细解读信号量,包括其作为计数器的基本原理,申请与释放的PV操作过程,以及Linux中有名/无名信号量的初始化、销毁和操作函数。通过电影院票务的例子,阐述如何管理临界资源并发访问。

信号量也叫信号灯,其本质就是一个计数器,描述临界资源的数目大小。(最多能有多少资源分配给线程)。


目录

一、什么是信号量?

二、信号量申请和释放的过程(PV操作)

三、信号量操作函数

1、有名信号量的初始化和销毁

(1) 有名信号量的初始化 sem_open

(2) 有名信号量的关闭 sem_close

2、无名信号量的初始化和销毁

(1) 无名信号量初始化 sem_init

(2) 无名信号量的销毁 sem_destroy

3、有名 / 无名信号量的申请和释放

(1) 申请信号量 sem_wait

(2) 释放信号量 sem_post


一、什么是信号量?

电影院预售1000张票,一旦预定成功,就会有你的位置,其他人无法占用;每有一个人退票或者看完电影,这张票就返还给电影院。

现在这1000张票就是一个临界资源 tickets,我们把这个临界资源划分成为一个个小资源,分配给线程,这样可以允许多个线程同时访问临界资源,从而实现并发。

信号量是一个计数器,这个计数器被合理使用,能够达到对临界资源预定的目的。每个线程要想访问临界资源,都得申请信号量!

二、信号量申请和释放的过程(PV操作)

其实信号量的申请和释放过程,和之前说线程资源冲突的场景有点类似。假设tickets = 1000,最基本的理解如下:

申请信号量 ==》 tickets --

释放信号量 ==》 tickets ++

但是由于 ticket-- 或者 tickets ++这个操作不是原子的,会被其他线程“乱入”,所以我们要对其进行加锁,等到自增或者自减结束以后,我们再解锁。这就是典型的PV操作

tickets = 0,此时说明票已经全部售出了,如果还有线程要来申请,那就只能让这些线程暂时挂起,等其他线程释放信号量以后,再给唤醒挂起的线程。

三、信号量操作函数

Linux专门为信号量提供一种数据结构,和之前学的信号集一样

sem_t sem;    //创建一个信号量

信号量分为有名信号量无名信号量System V信号量,有名信号量和无名信号量只是初始化和销毁的方式不同,他们对信号量的申请和释放方式是一样的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值