9

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();
}

どこも変更されておらず、joins があるため、スレッドがそれを使用して完了していることが保証されています。ただし、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こと) を伴います。しかし、クローンを作成せずにそれを行うことは可能ですか?

4

1 に答える 1