环形队列的生产者和消费者访问不同下标,除了满或者空,也因为这个原因,这个模型里,生产者和消费者可以同时执行。
读者写者问题
常见解决读多写少,但是不仅限于此
读者写者模型:有一批数据,读的人特别多,修改的人特别少。
读者写者的321
1:有多个读线程和若干个写线程,在一个内存区域负责数据操控。
2:读者、写者
3:读者和读者:共享 ;写者和写者:互斥 ;读者和写者:互斥且同步
和消费者模型相比最重大的区别
特别的地方:在加锁这里
如果你是读者,就调用读加锁
如果你写者,就调用写加锁
读优先:可能会导致写者饥饿问题,读者优先高
互斥锁的同步:就是为了协同,解决饥饿问题。提高效率。
写优先:先做完当前的事,但下一个写优先
公平占有锁:不管优先级,谁占到归谁
读优先的伪代码如上
读锁是为了保证r计数器的原子性
然后读的时候把写给锁了 很坏
自旋锁
因为占有临界资源的线程,在临界资源呆的时间特别短,为了效率,让当前线程不要挂起,让其处于自旋状态,不断去检测锁的状态。
自旋锁的底层伪代码实现:不成功就go到头部继续判断,不用挂起
自旋锁自旋的时候,用户区的感觉也像是被挂起了一样,被卡住了。
trylock相关
非trylock函数,申请失败就被挂起,一直等
没有携带timeout,失败就立马返回
携带timeout,时间到了出错返回
计算机体系内到处都是协议,包括硬件