信号量
- 抽象数据类型:
- P(): sem减1,if sem < 0 waiting , else continue
- V(): sem加1,if sem <= 0 唤醒一个等待的P
- 信号量是正数,被保护的变量
- 初始化完成之后,唯一能够改变一个信号量的值的办法是通过P()和V()
- 操作必须是原子的,P()能够被阻塞,而V()不会阻塞
- 什么是管程
- 一个锁:指定临界区
- 0或者多个条件变量: 等待/通知信号量用于管理并发访问共享数据
- 一般方法:
- 收集在对象/模块中的相关共享数据
- 定义方法来访问共享数据
- lock
- Lock::Acquire() - 等待直到锁可用,然后抢占锁
- Look::Release() - 释放锁,唤醒等待者如果有
- Condition Variable
- 允许处于等待状态进入临界区
- 允许处于等待(睡眠)的线程进入临界区
- 某个时刻原子释放锁进入睡眠
- Wait() operation
- 释放锁,睡眠,重新获得锁返回后
- Signal() operation (or broadcast() operation)
- 唤醒等待者(或者所有等待者),如果有
- 允许处于等待状态进入临界区