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 在 并发
71,339 每月下载量
用于 212 个 crates (7 直接)
13KB
115 行
SeqLock
此库提供了 SeqLock
类型,它是一种针对读者进行高度优化的读写锁。
在某些情况下,SeqLock
的速度可以比标准库中的 RwLock
类型快两个数量级。另一个优点是读者不会饿死写者:即使有读者正在访问 SeqLock
,写者也不会被阻塞。
SeqLock
的唯一缺点是它只适用于 Copy
类型的数据。这意味着它不适用于包含指向拥有数据的指针的类型。
如果您需要为不是 Copy
类型的数据使用读写锁,则应使用 RwLock
。
实现
实现基于 Linux seqlock
类型。每个 SeqLock
包含一个序列计数器,该计数器跟踪锁定数据的修改。基本思想是读者将执行以下操作
- 读取序列计数器。
- 读取锁定中的数据。
- 再次读取序列计数器。
- 如果两个序列计数器的值不同,则循环回并再次尝试。
- 否则返回第 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 版,(LICENSE-APACHE 或 http://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,旨在包含在作品中,应按照上述方式双许可,不附加任何额外条款或条件。
依赖项
~0.4–5.5MB
~11K SLoC