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