Expand description
§XWOS RUST:条件量
条件量是操作系统比较底层的同步机制,可以同时阻塞多个线程。当条件成立,条件量可以唤醒一个或所有正在等待的线程。
XWOS RUST的条件量通常还需要一个伴生的锁一起工作。线程通常需要持有 锁 的情况下去等待条件量, 条件量阻塞线程的同时会同步释放 锁 。当条件成立,线程被唤醒时,条件量会自动获得 锁。
XWOS RUST的条件量机制,主要包括以下操作:
- 线程A等待条件量的 条件 成立而阻塞;
- 另一个线程B或中断或其他任意上下文使 条件 成立,并唤醒条件量上阻塞的线程,可以 单播 也可以 广播 。 为了防止两个上下文竞争 条件 ,条件量需要和一个 锁 一起使用,锁用于保护 条件 不会被同时访问。
- XWOS的条件量的锁的类型包括:
- 互斥锁
- 自旋锁
- 顺序锁的独占读锁
- 顺序锁的写锁
§创建
XWOS RUST的条件量可使用 Cond::new()
创建。
- 可以创建具有静态生命周期
static
约束的全局变量:
use xwrust::xwos::sync::cond::*;
static GLOBAL_COND: Cond = Cond::new();
- 也可以使用
alloc::sync::Arc
在heap中创建:
extern crate alloc;
use alloc::sync::Arc;
use xwrust::xwos::sync::cond::*;
pub fn xwrust_example_cond() {
let cond = Arc::new(Cond::new());
let cond_c = cond.clone();
}
§初始化
无论以何种方式创建的条件量,都必须在使用前调用 Cond::init()
进行初始化:
pub fn xwrust_example_cond() {
GLOBAL_COND.init();
cond.init();
}
§单播
Cond::unicast()
方法可用来使得条件量的条件成立,但只唤醒一个线程。此方法可在 任意 上下文使用。
§广播
Cond::broadcast()
方法可用来使得条件量的条件成立,并唤醒全部线程。此方法可在 任意 上下文使用。
§冻结与解冻
§冻结
XWOS RUST的条件量可以使用方法 Cond::freeze()
进行 冻结 操作,被冻结的条件量不能再进行 单薄 和 广播 操作。
§解冻
Cond::thaw()
方法是冻结 操作的逆操作。条件量解冻后,可重新进行 单薄 和 广播 操作。
§等待
等待操作需要在获得锁的情况下进行,因此 等待 的方法实现在锁的 守卫(Guard) 内部,以便区分锁的类型:
§普通等待
普通等待 的方法只可在 线程 上下文中使用,会 消费 锁的 守卫(Guard) ,然后线程阻塞等待条件量:
- 通过 单播 或 广播 可唤醒线程,线程唤醒后,会进行获得锁的操作。当锁是互斥锁时,线程可能又会因无法获得锁而被阻塞。
- 当线程的阻塞等待被中断时,会在
Err
中返回CondError::Interrupt
。 - 获得锁后,会在
Ok
中重新返回锁的 守卫(Guard) 。 - 当发生错误,返回
Err
时,锁的 守卫(Guard) 被 消费 ,生命周期结束,不再可用。
各种锁的 等待 条件量的方法:
- 互斥锁:
crate::xwos::lock::mtx::MutexGuard::wait()
- 自旋锁:
crate::xwos::lock::spinlock::SpinlockGuard::wait()
- 顺序锁的独占读锁:
crate::xwos::lock::seqlock::SeqlockGuard::wait()
- 顺序锁的写锁:
crate::xwos::lock::seqlock::SeqlockGuard::wait()
§超时等待
超时等待 的方法只可在 线程 上下文中使用,会 消费 锁的 守卫(Guard) ,然后线程阻塞等待条件量,等待时会指定一个唤醒时间点:
- 通过 单播 或 广播 可唤醒线程,线程唤醒后,会进行获得锁的操作。 当锁是互斥锁时,线程可能又会因无法获得锁而被阻塞,但到指定的唤醒时间点时一定会超时唤醒。
- 当线程的阻塞等待被中断时,会在
Err
中返回CondError::Interrupt
。 - 当到达指定的唤醒时间点,线程被唤醒,并返回
CondError::Timedout
。 - 获得锁后,会在
Ok
中重新返回锁的 守卫(Guard) 。 - 当发生错误,返回
Err
时,锁的 守卫(Guard) 被 消费 ,生命周期结束,不再可用。
各种锁的 等待 条件量的方法:
- 互斥锁:
crate::xwos::lock::mtx::MutexGuard::wait_to()
- 自旋锁:
crate::xwos::lock::spinlock::SpinlockGuard::wait_to()
- 顺序锁的独占读锁:
crate::xwos::lock::seqlock::SeqlockGuard::wait_to()
- 顺序锁的写锁:
crate::xwos::lock::seqlock::SeqlockGuard::wait_to()
§不可中断等待
不可中断等待 的方法只可在 线程 上下文中使用,会 消费 锁的 守卫(Guard) ,然后线程阻塞等待条件量,并且不可被中断:
- 通过 单播 或 广播 可唤醒线程,线程唤醒后,会进行获得锁的操作。 当锁是互斥锁时,线程可能又会因无法获得锁而被阻塞,互斥锁的阻塞等待同样是不可被中断的。
- 获得锁后,会在
Ok
中重新返回锁的 守卫(Guard) 。 - 当发生错误,返回
Err
时,锁的 守卫(Guard) 被 消费 ,生命周期结束,不再可用。
各种锁的 等待 条件量的方法:
- 互斥锁:
crate::xwos::lock::mtx::MutexGuard::wait_unintr()
- 自旋锁:
crate::xwos::lock::spinlock::SpinlockGuard::wait_unintr()
- 顺序锁的独占读锁:
crate::xwos::lock::seqlock::SeqlockGuard::wait_unintr()
- 顺序锁的写锁:
crate::xwos::lock::seqlock::SeqlockGuard::wait_unintr()
§绑定到信号选择器
条件量是 同步对象 ,可以通过方法 Cond::bind()
将条件量绑定到信号选择器 Sel<M>
上,通过 Sel<M>
,单一线程可以同时等待多个不同的 同步对象 。
条件量采用 非独占 的方式进行绑定。
§示例
Structs§
- 条件量对象结构体
- 条件量的选择子
Enums§
- 条件量的错误码
Constants§
- XWOS条件量对象占用的内存大小