スコープ付きスレッド
通常のスレッドは、周囲の環境から借用することはできません:
// 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 つのスレッドによる可変借用か、 任意個のスレッドによる不変借用のいずれか一方だけが可能です。