我什么时候应该使用std :: thread :: Builder而不是std :: thread :: spawn?

Ang*_*gel 6 rust

阅读完这些内容std::thread::Builderstd::thread::spawn了解它们之间的差异(或多或少),但建议总是使用它std::thread::Builder吗?

我不明白为什么有两个; 有人可以向我解释什么时候最好使用其中一个?在某些情况下,或许不能或不应该使用其中一种?


let child: std::thread::JoinHandle<()> = std::thread::spawn(move || {
      for a in 0..100{
        println!("D");   
        std::thread::sleep(std::time::Duration::from_millis(50));
    }
});

child.join();
Run Code Online (Sandbox Code Playgroud)
let child: Result<std::thread::JoinHandle<()>,_> = std::thread::Builder::new().name("child1".to_string()).spawn(move || {
    for a in 0..100{
        println!("D");   
        std::thread::sleep(std::time::Duration::from_millis(50));
    }
});

child.unwrap().join();
Run Code Online (Sandbox Code Playgroud)

She*_*ter 7

通过列出与以下内容不直接对应的所有功能和类型thread::Builder回答所有问题的文档thread::spawn:

fn name(self, name: String) -> Builder
Run Code Online (Sandbox Code Playgroud)

命名要成为的线程.目前,该名称仅用于在恐慌消息中进行识别.

fn stack_size(self, size: usize) -> Builder
Run Code Online (Sandbox Code Playgroud)

设置新线程的堆栈大小.

fn spawn<F, T>(self, f: F) -> Result<JoinHandle<T>>
    where F: FnOnce() -> T,
          F: Send + 'static,
          T: Send + 'static
Run Code Online (Sandbox Code Playgroud)

...

与spawn free函数不同,此方法可以io::Result捕获在OS级别创建线程的任何失败.

所以a thread::Builder允许你:

  1. 设置线程名称.
  2. 设置堆栈大小.
  3. 处理错误以启动线程.

使用thread::spawn时,你不关心任何这些.