pub struct Cond { /* private fields */ }Expand description
条件量对象结构体
Implementations§
source§impl Cond
 
impl Cond
sourcepub fn freeze(&self) -> CondError
 
pub fn freeze(&self) -> CondError
冻结条件量
条件量被冻结后,可被线程等待,但被能被单播 Cond::unicast() 或广播 Cond::broadcast() 。
§上下文
- 任意
§错误码
- CondError::Ok没有错误
- CondError::NotInit条件量没有初始化
- CondError::AlreadyFrozen条件量已被冻结
§示例
use xwrust::xwos::sync::cond::*;
pub unsafe extern "C" fn xwrust_main() {
    // ...省略...
    condvar: Cond = Cond::new();
    condvar.init();
    condvar.freeze();
}sourcepub fn thaw(&self) -> CondError
 
pub fn thaw(&self) -> CondError
解冻条件量
被冻结的条件量解冻后,可被单播 Cond::unicast() 或广播 Cond::broadcast() 。
§上下文
- 任意
§错误码
- CondError::Ok没有错误
- CondError::NotInit条件量没有初始化
- CondError::AlreadyThawed条件量已解冻
§示例
use xwrust::xwos::sync::cond::*;
pub unsafe extern "C" fn xwrust_main() {
    // ...省略...
    condvar: Cond = Cond::new();
    condvar.init();
    condvar.freeze(); // 冻结
    // ...省略...
    condvar.thaw(); // 解冻
}sourcepub fn unicast(&self) -> CondError
 
pub fn unicast(&self) -> CondError
单播条件量对象
只会唤醒第一个线程,阻塞线程的队列使用的是先进先出(FIFO)算法 。
§上下文
- 任意
§错误码
- CondError::Ok没有错误
- CondError::NotInit条件量没有初始化
- CondError::AlreadyFrozen条件量已被冻结
§示例
use xwrust::xwos::sync::cond::*;
pub unsafe extern "C" fn xwrust_main() {
    // ...省略...
    condvar: Cond = Cond::new();
    condvar.init();
    // ...省略...
    condvar.unicast();
}sourcepub fn broadcast(&self) -> CondError
 
pub fn broadcast(&self) -> CondError
广播条件量
阻塞队列中的线程会全部被唤醒。
§上下文
- 任意
§错误码
- CondError::Ok没有错误
- CondError::NotInit条件量没有初始化
- CondError::AlreadyFrozen条件量已被冻结
§示例
use xwrust::xwos::sync::cond::*;
pub unsafe extern "C" fn xwrust_main() {
    // ...省略...
    condvar: Cond = Cond::new();
    condvar.init();
    // ...省略...
    condvar.broadcast();
}sourcepub fn bind<'a, const M: XwSz>(
    &'a self,
    sel: &'a Sel<M>,
    pos: XwSq,
) -> Result<CondSel<'a, M>, CondError>where
    [XwBmp; { _ }]: Sized,
 
pub fn bind<'a, const M: XwSz>(
    &'a self,
    sel: &'a Sel<M>,
    pos: XwSq,
) -> Result<CondSel<'a, M>, CondError>where
    [XwBmp; { _ }]: Sized,
绑定条件量对象到信号选择器
- 条件量绑定到信号选择器上时,采用 非独占 的方式进行绑定。
- 绑定成功,通过 Ok()返回CondSel<'a, M>。
- 如果位置已被其他 同步对象 以 独占 的方式占领,通过 Err()返回CondError::SelPosBusy。
- 当指定的位置超出范围(例如 Sel<M>只有8个位置,用户偏偏要绑定到位置9 ),通过Err()返回CondError::OutOfSelPos。
- 重复绑定,通过 Err()返回CondError::AlreadyBound。
CondSel<'a, M> 中包含条件量的绑定信息。 CondSel<'a, M> 与 Cond 与 Sel<M> 具有相同的生命周期约束 'a 。
CondSel::selected() 可用来判断条件量是否被选择。当 CondSel<'a, M> drop() 时,会自动解绑。
§参数说明
- sel: 信号选择器的引用
- pos: 位置
§上下文
- 任意
§错误码
- CondError::OutOfSelPos信号选择器的位置超出范围
- CondError::AlreadyBound条件量已经绑定
- CondError::SelPosBusy信号选择器的位置被占用
§示例
pub fn xwrust_example_sel() {
    // ...省略...
    let cond0 = Arc::new(Cond::new());
    cond0.init();
    let cond0sel = match cond0.bind(&sel, 0) {
        Ok(s) => { // 绑定成功,`s` 为 `CondSel`
            s
        },
        Err(e) => { // 绑定失败,`e` 为 `SelError`
            return;
        }
    };
    // ...省略...
}