1 信号量简介
信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问。
假设有一个人需要在停车场停车 :
1)首先判断停车场是否还有空车位(判断信号量是否还有资源);
2)停车场正好有空车位(信号量有资源),那么就可以直接将车开入空车位进行停车(获取信号量成功);
3)停车场已经没有空车位了(信号量没有资源),那么这个人可以选择不停车(获取信号量失败);也可以选择等待(任务阻塞),其他人将车开出停车场(释放信号量资源),然后再将车停入空车位。
空车位:信号量资源数(计数值)
让出占用车位:释放信号量(计数值++)
占用车位:获取信号量(计数值--)
当计数值大于0,代表有信号量资源。
当释放信号量,信号量计数值(资源数)加一
当获取信号量,信号量计数值(资源数)减一
信号量的计数值都有限制:限定最大值
信号量:用于传递状态。
如果最大值被限定为1,那么它就是二值信号量;如果最大值不是1,它就是计数型信号量
队列与信号量的对比:
队列 | 信号量 |
可以容纳多个数据; 创建队列有两部分内存:队列结构体 + 队列项存储空间 |
仅存放计数值,无法存放其他数据; 创建信号量,只需分配信号量结构体 |
写入队列:当队列满时,可阻塞; | 释放信号量:不可阻塞,计数值++ 当计数值为最大值时,返回失败 |
读取队列:当队列为空时,可阻塞; |