pub struct Builder { /* private fields */ }
Expand description
线程工厂,可用于配置新线程的属性。
可以在其上链接方法以对其进行配置。
有两种配置可供选择:
name
: specifies an associated name for the threadstack_size
: specifies the desired stack size for the thread
spawn
方法将获取构建器的所有权,并使用给定的配置为线程句柄创建 io::Result
。
thread::spawn
free 函数使用带有默认配置的 Builder
,并且 unwrap
是其返回值。
当您想从启动线程失败中恢复时,您可能想使用 spawn
而不是 thread::spawn
,实际上,free 函数会在 Builder
方法返回 io::Result
时 panic。
Examples
use std::thread;
let builder = thread::Builder::new();
let handler = builder.spawn(|| {
// 线程代码
}).unwrap();
handler.join().unwrap();
RunImplementations§
source§impl Builder
impl Builder
1.63.0 · sourcepub fn spawn_scoped<'scope, 'env, F, T>(
self,
scope: &'scope Scope<'scope, 'env>,
f: F
) -> Result<ScopedJoinHandle<'scope, T>>where
F: FnOnce() -> T + Send + 'scope,
T: Send + 'scope,
pub fn spawn_scoped<'scope, 'env, F, T>( self, scope: &'scope Scope<'scope, 'env>, f: F ) -> Result<ScopedJoinHandle<'scope, T>>where F: FnOnce() -> T + Send + 'scope, T: Send + 'scope,
使用通过此 Builder
设置的设置生成一个新的作用域线程。
与 Scope::spawn
不同,此方法会生成一个 io::Result
来捕获在操作系统级别创建线程的任何失败。
Panics
如果设置了线程名称并且它包含空字节,就会出现 panic。
Example
use std::thread;
let mut a = vec![1, 2, 3];
let mut x = 0;
thread::scope(|s| {
thread::Builder::new()
.name("first".to_string())
.spawn_scoped(s, ||
{
println!("hello from the {:?} scoped thread", thread::current().name());
// 我们可以在这里借用 `a`。
dbg!(&a);
})
.unwrap();
thread::Builder::new()
.name("second".to_string())
.spawn_scoped(s, ||
{
println!("hello from the {:?} scoped thread", thread::current().name());
// 我们甚至可以在这里可变地借用 `x`,因为没有其他线程在使用它。
x += a[0] + a[2];
})
.unwrap();
println!("hello from the main thread");
});
// 在作用域之后,我们可以再次修改和访问我们的变量:
a.push(4);
assert_eq!(x, a.len());
Runsource§impl Builder
impl Builder
sourcepub fn stack_size(self, size: usize) -> Builder
pub fn stack_size(self, size: usize) -> Builder
sourcepub fn spawn<F, T>(self, f: F) -> Result<JoinHandle<T>>where
F: FnOnce() -> T + Send + 'static,
T: Send + 'static,
pub fn spawn<F, T>(self, f: F) -> Result<JoinHandle<T>>where F: FnOnce() -> T + Send + 'static, T: Send + 'static,
通过获取 Builder
的所有权产生一个新线程,并向其 JoinHandle
返回一个 io::Result
。
衍生的线程可能比调用者活得长 (除非调用者线程是主线程; 当主线程结束时,整个进程将终止)。 连接句柄可用于在新线程终止时阻塞,包括恢复其 panics。
有关更完整的文档,请参见 thread::spawn
。
Errors
与 spawn
的 free 函数不同,此方法产生 io::Result
来捕获在操作系统级别创建线程的任何失败。
Panics
如果设置了线程名称并且它包含空字节,就会出现 panic。
Examples
use std::thread;
let builder = thread::Builder::new();
let handler = builder.spawn(|| {
// 线程代码
}).unwrap();
handler.join().unwrap();
Runsourcepub unsafe fn spawn_unchecked<'a, F, T>(self, f: F) -> Result<JoinHandle<T>>where
F: FnOnce() -> T + Send + 'a,
T: Send + 'a,
🔬This is a nightly-only experimental API. (thread_spawn_unchecked
#55132)
pub unsafe fn spawn_unchecked<'a, F, T>(self, f: F) -> Result<JoinHandle<T>>where F: FnOnce() -> T + Send + 'a, T: Send + 'a,
thread_spawn_unchecked
#55132)通过获取 Builder
的所有权来产生不受任何生命周期限制的新线程,并将 io::Result
返回其 JoinHandle
。
衍生的线程可能比调用者活得长 (除非调用者线程是主线程; 当主线程结束时,整个进程将终止)。 连接句柄可用于在新线程终止时阻塞,包括恢复其 panics。
此方法与 thread::Builder::spawn
相同,不同之处在于宽松的生命周期界限使其不安全。
有关更完整的文档,请参见 thread::spawn
。
Errors
与 spawn
的 free 函数不同,此方法产生 io::Result
来捕获在操作系统级别创建线程的任何失败。
Panics
如果设置了线程名称并且它包含空字节,就会出现 panic。
Safety
调用者必须确保新建线程的生命周期不会超过所提供线程闭包及其返回类型中的任何引用。 可以通过两种方式保证这一点:
- 确保在丢弃任何引用数据之前已调用
join
- 仅使用具有
'static
生命周期界限的类型,即没有'static
引用或仅具有'static
引用的类型 (thread::Builder::spawn
和thread::spawn
都静态地强制执行此属性)
Examples
#![feature(thread_spawn_unchecked)]
use std::thread;
let builder = thread::Builder::new();
let x = 1;
let thread_x = &x;
let handler = unsafe {
builder.spawn_unchecked(move || {
println!("x = {}", *thread_x);
}).unwrap()
};
// 调用者必须确保已调用 `join()`,否则,如果在执行线程闭包之前 `x` 被丢弃,则可以访问释放的内存!
handler.join().unwrap();
Run