pub struct DThdBuilder { /* private fields */ }
Expand description
动态线程的工厂模式结构体,可用于配置新线程的属性
name
设置线程的名字stack_size
设置线程的栈大小privileged
设置线程的系统权限
spawn
方法将获取构建器的所有权,并使用给定的配置创建线程,返回 Result
。
thd::spawn
独立的函数,并使用默认配置的 DThdBuilder
创建线程,返回 Result
。
§示例
use xwrust::xwos::thd;
let builder = thd::DThdBuilder::new();
builder.spawn(|_| {
// 线程代码;
// 返回值
});
Implementations§
source§impl DThdBuilder
impl DThdBuilder
sourcepub fn new() -> DThdBuilder
pub fn new() -> DThdBuilder
新建用于创建动态线程的工厂
§示例
use xwrust::xwos::thd;
let builder = thd::DThdBuilder::new()
.name("foo".into()) // 设置线程的名称
.stack_size(8 * 1024) // 设置线程栈大小
.privileged(true); // 设置系统权限
builder.spawn(|_| {
// 线程代码;
// 返回值
});
sourcepub fn name(self, name: String) -> DThdBuilder
pub fn name(self, name: String) -> DThdBuilder
设置动态线程的名称
§示例
use xwrust::xwos::thd;
use libc_print::std_name::println;
let builder = thd::DThdBuilder::new()
.name("foo".into()); // 设置线程的名称
builder.spawn(|ele| {
println!("My name is {}.", ele.name().unwrap());
// 线程代码;
// 返回值
});
sourcepub fn stack_size(self, size: XwSz) -> DThdBuilder
pub fn stack_size(self, size: XwSz) -> DThdBuilder
设置动态线程栈的大小
§示例
use xwrust::xwos::thd;
let builder = thd::DThdBuilder::new()
.stack_size(8 * 1024); // 设置线程栈大小
builder.spawn(|_| {
// 线程代码;
// 返回值
});
sourcepub fn privileged(self, privileged: bool) -> DThdBuilder
pub fn privileged(self, privileged: bool) -> DThdBuilder
设置动态线程栈的系统权限
§示例
use xwrust::xwos::thd;
let builder = thd::DThdBuilder::new()
.privileged(true); // 设置系统权限
builder.spawn(|_| {
// 线程代码;
// 返回值
});
sourcepub fn spawn<F, R>(self, f: F) -> Result<DThdHandle<R>, XwEr>where
F: FnOnce(Arc<DThdElement>) -> R + Send + 'static,
R: Send + 'static,
pub fn spawn<F, R>(self, f: F) -> Result<DThdHandle<R>, XwEr>where
F: FnOnce(Arc<DThdElement>) -> R + Send + 'static,
R: Send + 'static,
消费 DThdBuilder
,并新建一个动态线程
- 创建线程成功,返回一个包含
DThdHandle
的Result
; - 创建线程失败,返回一个包含
XwEr
的Result
,XwEr
指示错误的原因。
方法的签名:
'static
约束是因为新建的线程可能比调用者的生命周期更长,因此线程的闭包和返回值的生命周期限定为静态生命周期;Send
约束是因为闭包和返回值需要在线程之间进行转移。并且被移动到Send
约束的闭包的变量也必须是Send
的,否则编译器会报错。 RUSTC是通过Send
约束来区分闭包是不是另一线程的代码的。
§参数说明
- f: 线程的闭包
§示例
use xwrust::xwos::thd;
let builder = thd::DThdBuilder::new()
.name("foo".into()) // 设置线程的名称
.stack_size(8 * 1024) // 设置线程栈大小
.privileged(true); // 设置系统权限
match builder.spawn(|_| {
// 线程代码;
// 返回值
}) {
Ok(handler) => {
match handler.join() {
Ok(r) => {
// r 是线程闭包的返回值。
},
Err(e) => {
// `join()` 失败的错误码可通过 `e.state()` 获取。
// `e` 是 `DThdHandle<R>` ,重新被返回。
},
};
},
Err(rc) => {
// `rc` 是 `spawn()` 失败时的错误码。
}
};
sourcepub unsafe fn spawn_unchecked<'a, F, R>(
self,
f: F,
) -> Result<DThdHandle<R>, XwEr>where
F: FnOnce(Arc<DThdElement>) -> R + Send + 'a,
R: Send + 'a,
pub unsafe fn spawn_unchecked<'a, F, R>(
self,
f: F,
) -> Result<DThdHandle<R>, XwEr>where
F: FnOnce(Arc<DThdElement>) -> R + Send + 'a,
R: Send + 'a,
消费 DThdBuilder
,并产生一个新的动态线程
- 创建线程成功,返回一个包含
DThdHandle
的Result
; - 创建线程失败,返回一个包含
XwEr
的Result
,XwEr
指示错误的原因。
此方法只要求闭包 F
和 返回值 R
的生命周期一样长,然后不做其他限制,因此是 unsafe
的。
§参数说明
- f: 线程的闭包
§示例
use xwrust::xwos::thd;
let builder = thd::DThdBuilder::new()
.name("foo".into()) // 设置线程的名称
.stack_size(8 * 1024) // 设置线程栈大小
.privileged(true); // 设置系统权限
match unsafe { builder.spawn_unchecked(|_| {
// 线程代码;
// 返回值
})} {
Ok(handler) => {
match handler.join() {
Ok(r) => {
// r 是线程闭包的返回值。
},
Err(e) => {
// join() 失败时的错误码可通过 e.state() 获取。
// e 是 DThdHandle<R> ,重新被返回。
},
};
},
Err(rc) => {
// rc 是 spawn() 失败时的错误码。
}
};