前言
一. 信号量的理解
我们先举个例子来引入信号量的概念
我们如果想看电影,需要先买票,那么当我们买了票以后,那么相对应的电影院的座位就是属于我们的了,并且没有人能再占用。而共享资源就像电影院的座位一样
,如果我们需要,我们需要申请占用
,一旦我们申请成功,那么我们就一定可以获得
,就像一定可以坐上电影院的座位一样。
而当我们将电影院变成私人电影院时,只有一个位子
,只要有人预约了,那么其他人就不能预约了,只能等这个人看完电影,归还座位的使用权时,其他人才能预约。这不就达到了互斥
了吗
所以,
信号量本质就是类似于一个计数器,描述资源数量的计数器
,如同电影院的座位数,只要有人申请成功
,计数器就-1
,直到没有座位,计数器为0时
,不能再申请
;而当一个进程访问完共享资源,归还时
,计数器再+1
,可以再有别人申请。
代码就会变成这样
我们将申请信号量的操作叫做P操作
,释放信号量的操作叫做V操作
而信号量是协和进程间通信的,所以多个进程都需要看得到同一个计数器,同一个信号量
,这不就和共享内存和消息队列
中,让不同进程看见同一份资源一样吗。所以信号量也属于System V的进程间通信。
而互斥的实现就是,信号量初始为1
,一旦申请就减为0
,之后的进程无法申请,只有当申请到的进程归还资源
,信号量+1
,才能被其他进程申请,这就是互斥的实现
二. 信号量的使用
初始化信号量
#include<semaphore.h>
int sem_init(sem_t*sem,int pshared,unsigned int value)
参数:
sem:信号量的地址
pshared:传0代表线程间共享,非0表示进程间共享
value:信号量的初始值
销毁信号量
int sem_destroy(sem_t *sem);
等待信号量
等待信号量,会将信号量的值减1,代表申请到信号量,为P操作
int sem_wait(sem_t *sem);
发布信号量
发布信号量,表示资源使用完毕,将信号量值加1,为V操作
int sem_post(sem_t*sem);
结束语
感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。