Struct std::thread::Builder

1.0.0 · source ·
pub struct Builder { /* private fields */ }
Expand description

线程工厂,可用于配置新线程的属性。

可以在其上链接方法以对其进行配置。

有两种配置可供选择:

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();
Run

Implementations§

source§

impl Builder

1.63.0 · source

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());
Run
source§

impl Builder

source

pub fn new() -> Builder

生成用于生成线程的基本配置,从中可以链接配置方法。

Examples
use std::thread;

let builder = thread::Builder::new()
                              .name("foo".into())
                              .stack_size(32 * 1024);

let handler = builder.spawn(|| {
    // 线程代码
}).unwrap();

handler.join().unwrap();
Run
source

pub fn name(self, name: String) -> Builder

命名未来线程。当前,该名称仅用于 panic 消息中的标识。

该名称不能包含空字节 (\0)。

有关命名线程的更多信息,请参见 模块级文档

Examples
use std::thread;

let builder = thread::Builder::new()
    .name("foo".into());

let handler = builder.spawn(|| {
    assert_eq!(thread::current().name(), Some("foo"))
}).unwrap();

handler.join().unwrap();
Run
source

pub fn stack_size(self, size: usize) -> Builder

设置新线程的栈大小 (以字节为单位)。

如果平台指定最小栈大小,则实际栈大小可能大于这个值。

有关线程的栈大小的更多信息,请参见 模块级文档

Examples
use std::thread;

let builder = thread::Builder::new().stack_size(32 * 1024);
Run
source

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();
Run
source

pub 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)

通过获取 Builder 的所有权来产生不受任何生命周期限制的新线程,并将 io::Result 返回其 JoinHandle

衍生的线程可能比调用者活得长 (除非调用者线程是主线程; 当主线程结束时,整个进程将终止)。 连接句柄可用于在新线程终止时阻塞,包括恢复其 panics。

此方法与 thread::Builder::spawn 相同,不同之处在于宽松的生命周期界限使其不安全。 有关更完整的文档,请参见 thread::spawn

Errors

spawn 的 free 函数不同,此方法产生 io::Result 来捕获在操作系统级别创建线程的任何失败。

Panics

如果设置了线程名称并且它包含空字节,就会出现 panic。

Safety

调用者必须确保新建线程的生命周期不会超过所提供线程闭包及其返回类型中的任何引用。 可以通过两种方式保证这一点:

  • 确保在丢弃任何引用数据之前已调用 join
  • 仅使用具有 'static 生命周期界限的类型,即没有 'static 引用或仅具有 'static 引用的类型 (thread::Builder::spawnthread::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

Trait Implementations§

source§

impl Debug for Builder

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

使用给定的格式化程序格式化该值。 Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

获取 selfTypeIdRead more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

从拥有的值中一成不变地借用。 Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

从拥有的值中借用。 Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

返回未更改的参数。

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

调用 U::from(self)

也就是说,这种转换是 From<T> for U 实现选择执行的任何操作。

source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

发生转换错误时返回的类型。
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

执行转换。
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

发生转换错误时返回的类型。
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

执行转换。