Expand description
§XWOS RUST:顺序锁
顺序锁是对自旋锁改良后的锁,顺序锁中包含一个自旋锁,并且带有一个顺序值。 顺序锁将临界区分为三种:
§独占写
任何对顺序锁临界区的 写 操作都是独占的,每次 写 操作时,会先上锁自旋锁, 然后增加顺序值,离开临界区时也会再次增加顺序值。言外之意,顺序值增加两次,顺序值增加的次数是 偶数 。
锁的模式:
- 当临界区只被多个线程访问时,需使用关闭抢占的模式:
SeqlockMode::WriteLock
- 当临界区被中断底半部访问时,需使用关闭中断底半部的模式:
SeqlockMode::WriteLockBh
- 当临界区被多个线程和单一中断访问时,需使用关闭中断的模式:
SeqlockMode::WriteLockCpuirq
- 当临界区被多个中断上下文访问时,需使用保存中断标志的模式:
SeqlockMode::WriteLockCpuirqSave(None)
§非独占读
如果多个CPU进行的是 只读 操作,它们可以同时进入 非独占读临界区 。 CPU进入非独占读临界区无需获得自旋锁,但需要先测试顺序值是否为 偶数,并记录此时的顺序值。 当退出读临界区时,需要再次读取顺序值,并与之前记录的值进行比较:
- 如果相等,表示读的结果有效;
- 如果不相等,则表示读的过程中别的CPU进行了写操作,此次的读操作无效。
§独占读
如果希望读临界区不会被写操作无效掉,可以使用独占读的方式, 独占读会排斥其他CPU上的独占写和独占读操作,但不会排斥非独占读, 其他CPU依然可以进入非独占读临界区。
锁的模式 :
- 当临界区只被多个线程访问时,需使用关闭抢占的模式:
SeqlockMode::ReadExclusiveLock
- 当临界区被中断底半部访问时,需使用关闭中断底半部的模式:
SeqlockMode::ReadExclusiveLockBh
- 当临界区被多个线程和单一中断访问时,需使用关闭中断的模式:
SeqlockMode::ReadExclusiveLockCpuirq
- 当临界区被多个中断上下文访问时,需使用保存中断标志的模式:
SeqlockMode::ReadExclusiveLockCpuirqSave(None)
§创建
XWOS RUST的顺序锁可使用 Seqlock::new()
创建。
- 可以创建具有静态生命周期
static
约束的全局变量:
use xwrust::xwos::lock::seqlock::*;
static GLOBAL_SEQLOCK: Seqlock<u32> = Seqlock::new(0);
- 也可以使用
alloc::sync::Arc
在heap中创建:
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));
}
§解锁
上锁后返回的 SeqlockGuard
。 SeqlockGuard
的生命周期结束时,会自动解锁。
也可调用 Seqlock::unlock()
主动消费掉 SeqlockGuard
来解锁。
§上锁
上锁的方法 Seqlock::lock()
除了 自旋 等待,改变顺序值外,还会根据上锁模式增加额外操作:
- 只关闭抢占的模式:
SeqlockMode::WriteLock
以及SeqlockMode::ReadExclusiveLock
- 关闭中断底半部的模式:
SeqlockMode::WriteLockBh
以及SeqlockMode::ReadExclusiveLockBh
- 关闭全局中断的模式:
SeqlockMode::WriteLockCpuirq
以及SeqlockMode::ReadExclusiveLockCpuirq
- 保存中断全局标志并关闭全局中断的模式:
SeqlockMode::WriteLockCpuirqSave(None)
以及SeqlockMode::ReadExclusiveLockCpuirqSave(None)
§尝试上锁
尝试上锁的方法 Seqlock::trylock()
只会测试一下锁,不会 自旋 等待,上锁成功后还会根据上锁模式增加额外操作:
- 只关闭抢占的模式:
SeqlockMode::WriteLock
以及SeqlockMode::ReadExclusiveLock
- 关闭中断底半部的模式:
SeqlockMode::WriteLockBh
以及SeqlockMode::ReadExclusiveLockBh
- 关闭全局中断的模式:
SeqlockMode::WriteLockCpuirq
以及SeqlockMode::ReadExclusiveLockCpuirq
- 保存中断全局标志并关闭全局中断的模式:
SeqlockMode::WriteLockCpuirqSave(None)
以及SeqlockMode::ReadExclusiveLockCpuirqSave(None)
§示例
Structs§
- 顺序锁结构体
- 顺序锁的RAII Guard
- 顺序锁共享读临界区的守卫
Enums§
- 顺序锁的错误码
- 顺序锁的上锁模式
Constants§
- XWOS顺序锁占用的内存大小