スコープ付きスレッド

通常のスレッドはそれらの環境から借用することはできません:

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が完了するとき、全てのスレッドはjoinされることが保証されているので、スレッドが借用したデータを返すことができるためです。
  • 通常のRustの借用のルールが適用されます: 一つのスレッドがミュータブルで借用すること、または任意の数のスレッドからイミュータブルで借用すること。