信号量也叫信号灯,其本质就是一个计数器,描述临界资源的数目大小。(最多能有多少资源分配给线程)。
目录
一、什么是信号量?
电影院预售1000张票,一旦预定成功,就会有你的位置,其他人无法占用;每有一个人退票或者看完电影,这张票就返还给电影院。
现在这1000张票就是一个临界资源 tickets,我们把这个临界资源划分成为一个个小资源,分配给线程,这样可以允许多个线程同时访问临界资源,从而实现并发。

信号量是一个计数器,这个计数器被合理使用,能够达到对临界资源预定的目的。每个线程要想访问临界资源,都得申请信号量!
二、信号量申请和释放的过程(PV操作)
其实信号量的申请和释放过程,和之前说线程资源冲突的场景有点类似。假设tickets = 1000,最基本的理解如下:
申请信号量 ==》 tickets --
释放信号量 ==》 tickets ++
但是由于 ticket-- 或者 tickets ++这个操作不是原子的,会被其他线程“乱入”,所以我们要对其进行加锁,等到自增或者自减结束以后,我们再解锁。这就是典型的PV操作

tickets = 0,此时说明票已经全部售出了,如果还有线程要来申请,那就只能让这些线程暂时挂起,等其他线程释放信号量以后,再给唤醒挂起的线程。
三、信号量操作函数
Linux专门为信号量提供一种数据结构,和之前学的信号集一样
sem_t sem; //创建一个信号量
信号量分为有名信号量、无名信号量、System V信号量,有名信号量和无名信号量只是初始化和销毁的方式不同,他们对信号量的申请和释放方式是一样的

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

被折叠的 条评论
为什么被折叠?



