xwrust::xwos::lock

Module seqlock

source
Expand description

§XWOS RUST:顺序锁

顺序锁是对自旋锁改良后的锁,顺序锁中包含一个自旋锁,并且带有一个顺序值。 顺序锁将临界区分为三种:

§独占写

任何对顺序锁临界区的 操作都是独占的,每次 操作时,会先上锁自旋锁, 然后增加顺序值,离开临界区时也会再次增加顺序值。言外之意,顺序值增加两次,顺序值增加的次数是 偶数

锁的模式:

§非独占读

如果多个CPU进行的是 只读 操作,它们可以同时进入 非独占读临界区 。 CPU进入非独占读临界区无需获得自旋锁,但需要先测试顺序值是否为 偶数,并记录此时的顺序值。 当退出读临界区时,需要再次读取顺序值,并与之前记录的值进行比较:

  • 如果相等,表示读的结果有效;
  • 如果不相等,则表示读的过程中别的CPU进行了写操作,此次的读操作无效。
§独占读

如果希望读临界区不会被写操作无效掉,可以使用独占读的方式, 独占读会排斥其他CPU上的独占写和独占读操作,但不会排斥非独占读, 其他CPU依然可以进入非独占读临界区。

锁的模式 :

§创建

XWOS RUST的顺序锁可使用 Seqlock::new() 创建。

  • 可以创建具有静态生命周期 static 约束的全局变量:
use xwrust::xwos::lock::seqlock::*;

static GLOBAL_SEQLOCK: Seqlock<u32> = Seqlock::new(0);
extern crate alloc;
use alloc::sync::Arc;

use xwrust::xwos::lock::seqlock::*;

pub fn xwrust_example_seqlock() {
    let seqlock: Arc<Seqlock<u32>> = Arc::new(Seqlock::new(0));
}

§解锁

上锁后返回的 SeqlockGuardSeqlockGuard 的生命周期结束时,会自动解锁。 也可调用 Seqlock::unlock() 主动消费掉 SeqlockGuard 来解锁。

§上锁

上锁的方法 Seqlock::lock() 除了 自旋 等待,改变顺序值外,还会根据上锁模式增加额外操作:

§尝试上锁

尝试上锁的方法 Seqlock::trylock() 只会测试一下锁,不会 自旋 等待,上锁成功后还会根据上锁模式增加额外操作:

§示例

XWOS/xwam/xwrust-example/xwrust_example_seqlock

Structs§

Enums§

Constants§