#rwlock #thread #bare-metal #seqlock

spin-seq

基于 seqlock crate 的分支,适用于裸机使用

1 个不稳定版本

0.2.0 2023年10月20日

#1768嵌入式开发

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许可证定义,您有意提交以包含在工作中的任何贡献,将如上所述双授权,没有任何附加条款或条件。

依赖项

~145KB