文章目录
- 读者写者模型:
- 1. 基本理论
- 消费者生产者模型的321原则
- 2. 操作
- 3.理解
- 4. 优先级
- 挂起等待特性的锁 VS 自旋锁
- 线程访问临界资源花费的时间问题:
- 线程如何得知会在临界资源中等待的时间呢?
- 自旋锁的使用
读者写者模型:
1. 基本理论
- 对数据大部分的操作是读取,少量的操作是写入
- 判断依据是进行数据读取或者消费的一端是否会将数据取走,如果不取走就可以考虑读者写者模型
- 黑板报的例子
- 读者和写者:互斥关系,同步关系。写完看,看完就写是同步。写完之前读到的内容肯定不全或者错误,所以是互斥。
- 写者和写者:互斥关系,存在内容的覆盖
- 读者和读者:没有关系,因为读者不会取走资源而消费者之间会存在竞争关系
- 各种关系之间依靠加锁的方式维护
- 黑板报的例子
消费者生产者模型的321原则
3:三种关系
读者和读者,读者和写者,写者和写者
2:两种角色
1:一个交易场所
提供一段缓冲区
2. 操作
3.理解
读者reader++的过程中写者可以竞争到锁进来,如果有读者就挂起wait(),此时锁是释放的,交给读者来–,等到reader==0,wait属性重新获取锁从而实现下面的操作。在写者wait()之后获取锁开始进行修改时,任何的写者或者读者都无法进入,就维护了互斥关系。
4. 优先级
读者优先:读者和写者同时到来的时候,我们让读者先进入访问。
写者优先:读者和写者同时到来的时候,比当前写者晚来的所有读者都不要进入临界区访问了,邓林杰去中没有读者了让写者进去。
默认读者优先,本来读者多写者少,所以会存在写饥饿问题的。
挂起等待特性的锁 VS 自旋锁
线程挂起等待,然后再用条件变量唤醒
线程访问临界资源花费的时间问题:
线程的挂起是需要成本的,线程PCB的等待队列和状态的调整。
- 如果花费的时间很长,就适合挂起等待锁。
- 如果花费时间很短,没必要挂起等待没有竞争到锁的线程,就适合自旋锁,不断通过循环检测锁的状态。
线程如何得知会在临界资源中等待的时间呢?
线程不知道,程序员知道。