xwrust::xwos::sync

Module cond

source
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();
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)消费 ,生命周期结束,不再可用。

各种锁的 等待 条件量的方法:

§超时等待

超时等待 的方法只可在 线程 上下文中使用,会 消费 锁的 守卫(Guard) ,然后线程阻塞等待条件量,等待时会指定一个唤醒时间点:

  • 通过 单播广播 可唤醒线程,线程唤醒后,会进行获得锁的操作。 当锁是互斥锁时,线程可能又会因无法获得锁而被阻塞,但到指定的唤醒时间点时一定会超时唤醒。
  • 当线程的阻塞等待被中断时,会在 Err 中返回 CondError::Interrupt
  • 当到达指定的唤醒时间点,线程被唤醒,并返回 CondError::Timedout
  • 获得锁后,会在 Ok 中重新返回锁的 守卫(Guard)
  • 当发生错误,返回 Err 时,锁的 守卫(Guard)消费 ,生命周期结束,不再可用。

各种锁的 等待 条件量的方法:

§不可中断等待

不可中断等待 的方法只可在 线程 上下文中使用,会 消费 锁的 守卫(Guard) ,然后线程阻塞等待条件量,并且不可被中断:

  • 通过 单播广播 可唤醒线程,线程唤醒后,会进行获得锁的操作。 当锁是互斥锁时,线程可能又会因无法获得锁而被阻塞,互斥锁的阻塞等待同样是不可被中断的。
  • 获得锁后,会在 Ok 中重新返回锁的 守卫(Guard)
  • 当发生错误,返回 Err 时,锁的 守卫(Guard)消费 ,生命周期结束,不再可用。

各种锁的 等待 条件量的方法:

§绑定到信号选择器

条件量是 同步对象 ,可以通过方法 Cond::bind() 将条件量绑定到信号选择器 Sel<M> 上,通过 Sel<M> ,单一线程可以同时等待多个不同的 同步对象

条件量采用 非独占 的方式进行绑定。

§示例

XWOS/xwam/xwrust-example/xwrust_example_cond

Structs§

  • 条件量对象结构体
  • 条件量的选择子

Enums§

Constants§