在阅读了Robert Love的LKD之后,我学习了rwlock和seqlock,它们都是基于spinlock的。
当区分读取器和写入器时,rwlock比自旋锁更好,它会获得更好的性能。然而,rwlock会让作家感到不安。
Seqlock解决了Rwlock制作作家Hungury问题,但是,Seqlock的使用比RWLOCK少。那么,为什么 rwlock 比 seqlock 更受欢迎?
seqlock有一个很强的限制,即读者应该正确处理不一致的数据。
并非每种处理算法都允许不稳定的数据。在大多数情况下,此类数据只能是数字:整数、布尔值等。它们很少可以成为指针,因为过时的指针可能指向已经释放的内存,因此取消引用此类指针是不行的。
锁(以及其中的 rw-lock)没有"不一致的数据"限制,因此它们可以在更多情况下使用。
seqlock 下的不连续数据示例
假设有两个结构的字段受单个 seqlock 保护。第一个字段(a
按每个"写入"递增,第二个字段b
按每个"写入"递减。这两个字段最初都是0
。
可以假设,读者总会发现a + b
是0
。
但是在seqlock的情况下,这不是真的。 例如,在读取a
和b
之间,它可以"写入",因此a
值将是旧的,b
值将是新的,并且a + b
给出-1
。