范围线程

常规线程不能从它们所处的环境中借用:

use std::thread;

fn foo() {
    let s = String::from("Hello");
    thread::spawn(|| {
        println!("Length: {}", s.len());
    });
}

fn main() {
    foo();
}

不过,你可以使用范围线程来实现此目的:

use std::thread;

fn main() {
    let s = String::from("Hello");

    thread::scope(|scope| {
        scope.spawn(|| {
            println!("Length: {}", s.len());
        });
    });
}
  • 其原因在于,在 thread::scope 函数完成后,可保证所有线程都已联结在一起,使得线程能够返回借用的数据。
  • 此时须遵守常规 Rust 借用规则:你可以通过一个线程以可变的方式借用,也可以通过任意数量的线程以不可变的方式借用。