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