pub struct Seqlock<T: ?Sized> {
pub data: UnsafeCell<T>,
/* private fields */
}
Expand description
顺序锁结构体
Fields§
§data: UnsafeCell<T>
用户数据
Implementations§
source§impl<T: ?Sized> Seqlock<T>
impl<T: ?Sized> Seqlock<T>
sourcepub fn read_begin(&self) -> SeqlockReadGuard<'_, T>
pub fn read_begin(&self) -> SeqlockReadGuard<'_, T>
开启共享读临界区
若其他CPU正在访问写临界区,此方法会一直 自旋 测试是否可进入 共享读临界区 。
§示例
loop {
let guard = sqlk.read_begin();
let val = *guard; // 读取
if !guard.read_retry() {
break;
}
}
sourcepub fn lock(&self, mode: SeqlockMode) -> SeqlockGuard<'_, T>
pub fn lock(&self, mode: SeqlockMode) -> SeqlockGuard<'_, T>
获取顺序锁,若线程无法获取顺序锁,就阻塞等待,直到能获得锁为止
- 若成功获取顺序锁,将返回 RAII Guard :
SeqlockGuard
,用于提供 Scoped Lock 机制。SeqlockGuard
中包含Seqlock
的引用, 当SeqlockGuard
生命周期结束时,会在drop()
方法中自动解锁顺序锁。
- 若失败,将返回错误码
SeqlockError
。
§参数说明
- mode: 锁模式
SeqlockMode::WriteLock
写,关闭抢占SeqlockMode::WriteLockBh
写,关闭抢占、中断底半部SeqlockMode::WriteLockCpuirq
写,关闭抢占、中断底半部和中断SeqlockMode::WriteLockCpuirqSave(None)
写,关闭抢占、中断底半部和中断,并保存之前的中断标志SeqlockMode::ReadExclusiveLock
独占读,关闭抢占SeqlockMode::ReadExclusiveLockBh
独占读,关闭抢占、中断底半部SeqlockMode::ReadExclusiveLockCpuirq
独占读,关闭抢占、中断底半部和中断SeqlockMode::ReadExclusiveLockCpuirqSave(None)
独占读,关闭抢占、中断底半部和中断,并保存之前的中断标志
§示例
use xwrust::xwos::lock::seqlock::*;
static GLOBAL_SEQLOCK: Seqlock<u32> = Seqlock::new(0);
pub fn xwrust_example_seqlock() {
// ...省略...
let mut guard GLOBAL_SEQLOCK.lock(SeqlockMode::ReadExclusiveLockCpuirqSave(None));
*guard = 1; // 写共享变量
drop(guard); // guard 生命周期结束,自动解锁,并恢复中断标志
}
sourcepub fn trylock(
&self,
mode: SeqlockMode,
) -> Result<SeqlockGuard<'_, T>, SeqlockError>
pub fn trylock( &self, mode: SeqlockMode, ) -> Result<SeqlockGuard<'_, T>, SeqlockError>
尝试获取顺序锁,若线程无法获取顺序锁,立即返回错误
- 若成功获取顺序锁,将返回 RAII Guard :
SeqlockGuard
,用于提供 Scoped Lock 机制。SeqlockGuard
中包含Seqlock
的引用, 当SeqlockGuard
生命周期结束时,会在drop()
方法中自动解锁顺序锁。
- 若失败,将返回错误码
SeqlockError
。
§参数说明
- mode: 锁模式
SeqlockMode::WriteLock
写,关闭抢占SeqlockMode::WriteLockBh
写,关闭抢占、中断底半部SeqlockMode::WriteLockCpuirq
写,关闭抢占、中断底半部和中断SeqlockMode::WriteLockCpuirqSave(None)
写,关闭抢占、中断底半部和中断,并保存之前的中断标志SeqlockMode::ReadExclusiveLock
独占读,关闭抢占SeqlockMode::ReadExclusiveLockBh
独占读,关闭抢占、中断底半部SeqlockMode::ReadExclusiveLockCpuirq
独占读,关闭抢占、中断底半部和中断SeqlockMode::ReadExclusiveLockCpuirqSave(None)
独占读,关闭抢占、中断底半部和中断,并保存之前的中断标志
§错误码
SeqlockError::Again
尝试获取锁失败
§示例
use xwrust::xwos::lock::seqlock::*;
static GLOBAL_SEQLOCK: Seqlock<u32> = Seqlock::new(0);
pub fn xwrust_example_seqlock() {
// ...省略...
match GLOBAL_SEQLOCK.trylock(SeqlockMode::ReadExclusiveLockCpuirq) {
Ok(mut guard) => { // 上锁成功
*guard = 1; // 写共享变量
} // guard 生命周期结束,自动解锁
Err(e) => {
// 上锁失败
}
}
}
sourcepub fn unlock(guard: SeqlockGuard<'_, T>)
pub fn unlock(guard: SeqlockGuard<'_, T>)
解锁顺序锁,并释放 SeqlockGuard
§示例
use xwrust::xwos::lock::seqlock::*;
static GLOBAL_SEQLOCK: Seqlock<u32> = Seqlock::new(0);
pub fn xwrust_example_seqlock() {
// ...省略...
match GLOBAL_SEQLOCK.lock() {
Ok(mut guard) => { // 上锁成功
*guard = 1; // 访问共享变量
Seqlock::unlock(guard); // 主动解锁
}
Err(e) => {
// 上锁失败
}
}
}