信号量与互斥量
最后更新于:2022-04-02 04:08:47
[TOC]
## 信号量(semaphore)
- 一个控制同时访问一个资源的线程(进程)数量的抽象数据类型
- Semaphore内部封装一个整数(p)和一个睡眠线程集合(s),并提供两个原子操作
```
up()
p=p+
如果s.size0>0,从s中选择一个唤醒并执行
down()
if(p==0)( sleep(&semaphore))
p--
```
### 解决有界缓存区问题:生产者/消费者
类似队列形式进行消费生产模型
bad
```
// Producer
while(true){
tiem = produce_item()
insert_item(item)
}
// Consumer
while(true){
item = remove_item()
consume_item()
}
```
good
```
// 用到了3个信号量
empty=N, mutex=1,ful=0
// Producer
while(true){
tiem = produce_item()
down(&empty) // 要放东西前先empty 间一,down中可判断如果empt满了,不然其他进来
down(&mutex)
insert_item(item)
up(&mutex)
up(&full)
}
// Consumer
while(true){
down(&full)
down(&mutex)
item = remove_item()
up(&mutex)
up(&empty)
consume_item()
}
```
## 互斥量(mutex)
- 初始值为1的 信号量(semaphore)
- 可以用来锁住临界区
## 多信号量造成的死锁
bad
造成死锁
```
semaphore m1 = 1;
semaphore m2 = 1:
// 进程1
down(m1)
down(m2)
criticalRegion()
up(m1)
up(m2)
// 进程2
down(m2)
down(m1)
critcalRegion()
up(m1)
up(m2)
```
good
```
semaphore m1 = 1;
semaphore m2 = 1:
// 进程1
down(m1)
down(m2)
criticalRegion()
up(m1)
up(m2)
// 进程2
down(m1)
down(m2)
critcalRegion()
up(m1)
up(m2)
```
## 如何理解TSL/ Semaphore/ Mutex的关系
1. TSL/XCHG是基础能力(否则就得用忙等待算法)
2. Semaphore是一种基于TSL成立的算法和数据结构〔理解成解决方
案)
- Mutex是 Semaphore的一种产出(特殊情况)
3. 算法数据结构当然无穷无尽,参考:AQS( Abstract Queued
Synchronization)
';