numbers
作業をスレッドに委譲しているとき、次の例のように、すべてのスレッドよりも長く存続するデータを持っていることがよくあります。
use std::thread;
fn main() {
let numbers = vec![1, 2, 3];
let thread_a = thread::spawn(|| println!("{}", numbers.len()));
let thread_b = thread::spawn(|| println!("{}", numbers.len()));
thread_a.join().unwrap();
thread_b.join().unwrap();
}
どこも変更されておらず、join
s があるため、スレッドがそれを使用して完了していることが保証されています。ただし、Rust の借用チェッカーは次のことを判断できません。
error[E0373]: closure may outlive the current function, but it borrows `numbers`, which is owned by the current function
--> src/main.rs:6:34
|
6 | let thread_a = thread::spawn(|| println!("{}", numbers.len()));
| ^^ ------- `numbers` is borrowed here
| |
| may outlive borrowed value `numbers`
|
note: function requires argument type to outlive `'static`
--> src/main.rs:6:20
|
6 | let thread_a = thread::spawn(|| println!("{}", numbers.len()));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
help: to force the closure to take ownership of `numbers` (and any other referenced variables), use the `move` keyword
|
6 | let thread_a = thread::spawn(move || println!("{}", numbers.len()));
| ^^^^^^^
私がこれまで見てきた解決策はすべて、データの一部を複製すること (またはデータの一部を複製するArc
こと) を伴います。しかし、クローンを作成せずにそれを行うことは可能ですか?