#reader-writer #lock #read-lock #thread #rwlock #data #access

seqlock

一种读写锁,提供极快的读访问速度,且不会让写者饿死

4 个版本

0.2.0 2023 年 3 月 30 日
0.1.2 2020 年 10 月 27 日
0.1.1 2016 年 7 月 10 日
0.1.0 2016 年 5 月 28 日

404并发

Download history 12809/week @ 2024-03-14 14447/week @ 2024-03-21 16019/week @ 2024-03-28 18635/week @ 2024-04-04 17264/week @ 2024-04-11 19956/week @ 2024-04-18 16507/week @ 2024-04-25 16747/week @ 2024-05-02 15498/week @ 2024-05-09 12729/week @ 2024-05-16 11911/week @ 2024-05-23 17626/week @ 2024-05-30 18365/week @ 2024-06-06 18639/week @ 2024-06-13 17192/week @ 2024-06-20 13654/week @ 2024-06-27

71,339 每月下载量
用于 212 个 crates (7 直接)

Apache-2.0/MIT

13KB
115

SeqLock

Crates.io

文档

此库提供了 SeqLock 类型,它是一种针对读者进行高度优化的读写锁。

在某些情况下,SeqLock 的速度可以比标准库中的 RwLock 类型快两个数量级。另一个优点是读者不会饿死写者:即使有读者正在访问 SeqLock,写者也不会被阻塞。

SeqLock 的唯一缺点是它只适用于 Copy 类型的数据。这意味着它不适用于包含指向拥有数据的指针的类型。

如果您需要为不是 Copy 类型的数据使用读写锁,则应使用 RwLock

实现

实现基于 Linux seqlock 类型。每个 SeqLock 包含一个序列计数器,该计数器跟踪锁定数据的修改。基本思想是读者将执行以下操作

  1. 读取序列计数器。
  2. 读取锁定中的数据。
  3. 再次读取序列计数器。
  4. 如果两个序列计数器的值不同,则循环回并再次尝试。
  5. 否则返回第 2 步中读取的数据。

类似地,写者在写入锁定中的数据前后将增加序列计数器。一旦读者看到它在读取数据期间序列计数器没有变化,它就可以安全地将数据返回给调用者,因为已知该数据处于一致状态。

示例

use seqlock::SeqLock;

let lock = SeqLock::new(5);

{
    // Writing to the data involves a lock
    let mut w = lock.lock_write();
    *w += 1;
    assert_eq!(*w, 6);
}

{
    // Reading the data is a very fast operation
    let r = lock.read();
    assert_eq!(r, 6);
}

许可证

许可协议为以下之一

任选其一。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,旨在包含在作品中,应按照上述方式双许可,不附加任何额外条款或条件。

依赖项

~0.4–5.5MB
~11K SLoC