スコープ付きスレッド

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

// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

use std::thread;

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

fn main() {
    foo();
}

ただし、この場合はスコープ付きスレッドを使えます:

// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

use std::thread;

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

fn main() {
    foo();
}
  • その理由は、thread::scope 関数が完了すると、すべての スレッドが join されていることが保証されるため、借用したデータを返せるからです。
  • 通常の Rust の借用ルールが適用されます。1 つのスレッドによる可変借用か、 任意個のスレッドによる不変借用のいずれか一方だけが可能です。