0

スレッドセーフな方法で、複数のスレッドが同じデータ構造にアクセスできるようにしたいと考えています。

私はここまで来ることができます。ここで、私RwLockは十分に長生きしないと言われています。Rustの貸し借りは理解できますが、これでは頭が回らなくなります。

use std::sync::RwLock;
use std::thread;

fn func<'a>(vec_lock: &'a RwLock<Vec<i32>>) {
    let mut vec = vec_lock.write().unwrap();
    vec.push(2);
}

fn main() {
    let v: Vec<i32> = Vec::new(); // Shared data
    let v_lock = &RwLock::new(v); // RwLock ref

    let t1 = thread::spawn(move || func(v_lock)); // Give lock ref to func
    let t2 = thread::spawn(move || func(v_lock)); // Give lock ref to func
    t1.join().unwrap(); // Wait
    t2.join().unwrap();

    // Here v should be [2,2]
}

コンパイラは言う

error[E0597]: borrowed value does not live long enough
  --> src/main.rs:11:19
   |
11 |     let v_lock = &RwLock::new(v);
   |                   ^^^^^^^^^^^^^^ temporary value does not live long enough
...
19 | }
   | - temporary value only lives until here
   |
   = note: borrowed value must be valid for the static lifetime...

これを行う例が見つからないようです。どんなアイデアや指針も大歓迎です。

4

0 に答える 0