读写自旋锁
1:什么是自旋锁?
自旋锁就是互斥的同步原语,试图进入临界区的线程只用忙等的方式检测锁的状态。如果检测到锁未被持有,则进入临界区。因为采用忙等的方式,所以自旋锁必须是锁住很小的一块儿代码,并且很短的时间片。
2:读写自旋锁?
有些线程在临界区内只是简单的读取一些信息,不会涉及到信息的修改,允许读取信息的线程进入临界区不会有危险,同时还可以提高性能。所以将这些线程区分为读线程和写线程,从而就有了读写自旋锁。
3:如何使用?
临界区里面保护的共享资源有可能是一个单一变量,也可能是多个变量或者一个复杂结构的文件。所以每个共享的资源对应一把读写自旋锁。线程只允许采用如下方式来访问自旋锁。
1> 申请锁
2> 获得锁之后,读写共享资源
3> 释放锁
4:自旋锁满足四个属性
1> 互斥:任何时刻读者写者不能同时进入临界区。任意时刻只能至多一个写者进入临界区
2> 读者并发:满足互斥的前提下,多个读者可以同时进入临界区
3> 无死锁
4> 忙等:读写锁只用于很小的代码片段,线程等待期间不可以进入睡眠状态,因为睡眠/ 唤醒非常的耗时,大大延迟了获得锁的时间。
5:读者与写着竞争获得锁的时候,有一定的偏好策略
(1)读者优先:
如果锁被读者拥有,则优先偏好读者进入临界区
(2)写者优先:
写者在后到的读者/写者之前抢到锁