pub struct Sem { /* private fields */ }
Expand description
信号量对象结构体
Implementations§
source§impl Sem
impl Sem
sourcepub fn freeze(&self) -> SemError
pub fn freeze(&self) -> SemError
冻结信号量
信号量被冻结后,可被线程等待,但被能被单播 Sem::post()
。
§上下文
- 任意
§错误码
SemError::Ok
没有错误SemError::NotInit
信号量没有初始化SemError::AlreadyFrozen
信号量已被冻结
§示例
use xwrust::types::*;
use xwrust::errno::*;
use xwrust::xwos::sync::sem::*;
pub fn xwrust_example_sem() {
// ...省略...
let sem: Sem = Sem::new();
sem.init(0, XwSsq::max);
sem.freeze();
}
sourcepub fn thaw(&self) -> SemError
pub fn thaw(&self) -> SemError
解冻信号量
被冻结的信号量解冻后,可被单播 Sem::post()
。
§上下文
- 任意
§错误码
SemError::Ok
没有错误SemError::NotInit
信号量没有初始化SemError::AlreadyThawed
信号量已解冻
§示例
use xwrust::types::*;
use xwrust::errno::*;
use xwrust::xwos::sync::sem::*;
pub fn xwrust_example_sem() {
// ...省略...
let sem: Sem = Sem::new();
sem.init(0, XwSsq::max);
sem.freeze(); // 冻结
// ...省略...
sem.thaw(); // 解冻
}
sourcepub fn post(&self) -> SemError
pub fn post(&self) -> SemError
发布信号量
§上下文
- 任意
§错误码
SemError::Ok
没有错误SemError::NotInit
信号量没有初始化SemError::AlreadyFrozen
信号量已被冻结
§示例
use xwrust::types::*;
use xwrust::errno::*;
use xwrust::xwos::sync::sem::*;
pub fn xwrust_example_sem() {
// ...省略...
let sem: Sem = Sem::new();
sem.init(0, XwSsq::max);
// ...省略...
sem.post();
}
sourcepub fn get_max(&self) -> Result<XwSsq, SemError>
pub fn get_max(&self) -> Result<XwSsq, SemError>
获取信号量对象计数器的最大值
成功将在 Ok()
中返回信号量对象计数器的值。
§错误码
- Err(
SemError::NotInit
) 信号量没有初始化
§示例
use xwrust::types::*;
use xwrust::errno::*;
use xwrust::xwos::sync::sem::*;
pub fn xwrust_example_sem() {
// ...省略...
let sem: Sem = Sem::new();
sem.init(0, XwSsq::MAX);
// ...省略...
let res = sem.get_max();
match res {
Ok(max) => {
// 返回信号量的值
},
Err(e) => {
// 返回错误码
},
};
}
sourcepub fn get_value(&self) -> Result<XwSsq, SemError>
pub fn get_value(&self) -> Result<XwSsq, SemError>
获取信号量对象计数器的值
成功将在 Ok()
中返回信号量对象计数器的值。
§错误码
- Err(
SemError::NotInit
) 信号量没有初始化
§示例
use xwrust::types::*;
use xwrust::errno::*;
use xwrust::xwos::sync::sem::*;
pub fn xwrust_example_sem() {
// ...省略...
let sem: Sem = Sem::new();
sem.init(0, XwSsq::MAX);
// ...省略...
let res = sem.get_value();
match res {
Ok(val) => {
// 返回信号量的值
},
Err(e) => {
// 返回错误码
},
};
}
sourcepub fn wait(&self) -> SemError
pub fn wait(&self) -> SemError
等待并获取信号量
- 若信号量的值小于等于0,线程会阻塞等待。
- 当信号量的值大于0时,线程被唤醒,并取走一个值(信号量的值减少1),然后返回
SemError::Ok
。 - 当线程阻塞等待被中断时,返回
SemError::Interrupt
。
§上下文
- 线程
§错误码
SemError::Ok
没有错误SemError::NotInit
信号量没有初始化SemError::Interrupt
等待被中断SemError::NotThreadContext
不在线程上下文内SemError::DisPmpt
抢占被关闭SemError::DisBh
中断底半部被关闭SemError::DisIrq
中断被关闭
§示例
use xwrust::types::*;
use xwrust::xwos::sync::sem::*;
pub fn xwrust_example_sem() {
// ...省略...
let sem: Sem = Sem::new();
sem.init(0, XwSsq::max);
// ...省略...
let rc = sem.wait();
match rc {
SemError::Ok => {
// 获取信号量
},
_ => {
// 等待信号量失败
},
};
}
sourcepub fn wait_to(&self, to: XwTm) -> SemError
pub fn wait_to(&self, to: XwTm) -> SemError
限时等待并获取信号量
- 若信号量的值小于等于0,线程会阻塞等待,等待时会指定一个唤醒时间点。
- 当信号量的值大于0时,线程被唤醒,并取走一个值(信号量的值减少1),然后返回
SemError::Ok
。 - 当线程阻塞等待被中断时,返回
SemError::Interrupt
。 - 当到达指定的唤醒时间点,线程被唤醒,并返回
SemError::Timedout
。 - 如果
to
是过去的时间点,将直接返回SemError::Timedout
。
§参数说明
- to: 期望唤醒的时间点
§上下文
- 线程
§错误码
SemError::Ok
没有错误SemError::NotInit
信号量没有初始化SemError::Interrupt
等待被中断SemError::Timedout
等待超时SemError::NotThreadContext
不在线程上下文内SemError::DisPmpt
抢占被关闭SemError::DisBh
中断底半部被关闭SemError::DisIrq
中断被关闭
§示例
use xwrust::types::*;
use xwrust::errno::*;
use xwrust::xwos::sync::sem::*;
pub fn xwrust_example_sem() {
// ...省略...
let sem: Sem = Sem::new();
sem.init(0, XwSsq::max);
// ...省略...
let rc = sem.wait_to(xwtm::ft(xwtm::s(1))); // 最多等待1s
match rc {
SemError::Ok => {
// 获取信号量
},
_ => {
// 等待信号量失败
},
};
}
sourcepub fn wait_unintr(&self) -> SemError
pub fn wait_unintr(&self) -> SemError
等待并获取信号量,且等待不可被中断
- 若信号量的值小于等于0,线程会阻塞等待,且不可被中断,也不会超时。
- 当信号量的值大于0时,线程被唤醒,并取走一个值(信号量的值减少1),然后返回
SemError::Ok
。
§上下文
- 线程
§错误码
SemError::Ok
没有错误SemError::NotInit
信号量没有初始化SemError::NotThreadContext
不在线程上下文内SemError::DisPmpt
抢占被关闭SemError::DisBh
中断底半部被关闭SemError::DisIrq
中断被关闭
§示例
use xwrust::types::*;
use xwrust::errno::*;
use xwrust::xwos::sync::sem::*;
pub fn xwrust_example_sem() {
// ...省略...
let sem: Sem = Sem::new();
sem.init(0, XwSsq::max);
// ...省略...
let rc = sem.wait_unintr();
match rc {
SemError::Ok => {
// 获取信号量
},
_ => {
// 等待信号量失败
},
};
}
sourcepub fn trywait(&self) -> SemError
pub fn trywait(&self) -> SemError
尝试获取信号量
- 当信号量的值大于0时,就取走一个值(信号量的值减少1),然后返回
SemError::Ok
。 - 当信号量的值小于等于0时,立即返回
SemError::NoData
。
§上下文
- 任意
§错误码
SemError::Ok
没有错误SemError::NotInit
信号量没有初始化SemError::NoData
信号量不可用
§示例
use xwrust::types::*;
use xwrust::errno::*;
use xwrust::xwos::sync::sem::*;
pub fn xwrust_example_sem() {
// ...省略...
let sem: Sem = Sem::new();
sem.init(0, XwSsq::max);
// ...省略...
let rc = sem.trywait();
match rc {
SemError::Ok => {
// 获取信号量
},
_ => {
// 等待信号量失败
},
};
}
sourcepub fn bind<'a, const M: XwSz>(
&'a self,
sel: &'a Sel<M>,
pos: XwSq,
) -> Result<SemSel<'a, M>, SemError>where
[XwBmp; { _ }]: Sized,
pub fn bind<'a, const M: XwSz>(
&'a self,
sel: &'a Sel<M>,
pos: XwSq,
) -> Result<SemSel<'a, M>, SemError>where
[XwBmp; { _ }]: Sized,
绑定信号量对象到信号选择器
- 信号量绑定到信号选择器上时, 独占 一个位置。
- 绑定成功,通过
Ok()
返回SemSel<'a, M>
。 - 如果位置已被占领,通过
Err()
返回SemError::SelPosBusy
。 - 当指定的位置超出范围(例如
Sel<M>
只有8个位置,用户偏偏要绑定到位置9 ),通过Err()
返回SemError::OutOfSelPos
。 - 重复绑定,通过
Err()
返回SemError::AlreadyBound
。
SemSel<'a, M>
中包含信号量的绑定信息。 SemSel<'a, M>
与 Sem
与 Sel<M>
具有相同的生命周期约束 'a
。
SemSel::selected()
可用来判断信号量是否被选择。当 SemSel<'a, M>
drop()
时,会自动解绑。
§参数说明
- sel: 信号选择器的引用
- pos: 位置
§上下文
- 任意
§错误码
SemError::OutOfSelPos
信号选择器的位置超出范围SemError::AlreadyBound
信号量已经绑定SemError::SelPosBusy
信号选择器的位置被占用
§示例
pub fn xwrust_example_sel() {
// ...省略...
let sem0 = Arc::new(Sem::new());
sem0.init(0, XwSsq::MAX);
let sem0sel = match sem0.bind(&sel, 0) {
Ok(s) => { // 绑定成功,`s` 为 `SemSel`
s
},
Err(e) => { // 绑定失败,`e` 为 `SelError`
return;
}
};
// ...省略...
}