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;
}
};
// ...省略...
}