1 个不稳定版本
0.2.0 | 2023年10月20日 |
---|
#1768 在 嵌入式开发 中
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 License,版本 2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交以包含在工作中的任何贡献,将如上所述双授权,没有任何附加条款或条件。
依赖项
~145KB