如何在没有作用域的情况下使用 RwLocks?

How to use RwLocks without scoped?

我试图在不使用作用域线程的情况下在多个线程之间共享一个 RwLock,但我不知道如何使生命周期正确。我认为这是可能的(否则 RwLocks 有什么意义?)但我找不到任何例子。

这是我正在努力完成的玩具示例。任何意见,将不胜感激。 rust playpen for this code

use std::sync::{Arc, RwLock};
use std::thread;

struct Stuff {
    x: i32
}

fn main() {
    let mut stuff = Stuff{x: 5};
    helper(&mut stuff);
    println!("done");
}

fn helper(stuff: &mut Stuff){
    let rwlock = RwLock::new(stuff);
    let arc = Arc::new(rwlock);
    let local_arc = arc.clone();
    for _ in 0..10{
        let my_rwlock = arc.clone();
        thread::spawn(move || {
            let reader = my_rwlock.read().unwrap();
            // do some stuff
        });
    }
    let mut writer = local_arc.write().unwrap();
    writer.x += 1;
}

&mut 将引用发送到非作用域线程是不安全的,因为在引用数据被释放后线程可能仍然 运行。此外,在 helper returns 之后,主线程仍然可以变异 stuff,衍生线程也可以间接变异 stuff,这是不允许的在 Rust 中(一个变量只能有一个可变别名)。

相反,RwLock 应该拥有数据,而不是借用数据。这意味着 helper 应该收到 Stuff 而不是 &mut Stuff.

use std::sync::{Arc, RwLock};
use std::thread;

struct Stuff {
    x: i32
}

fn main() {
    let mut stuff = Stuff{x: 5};
    helper(stuff);
    println!("done");
}

fn helper(stuff: Stuff){
    let rwlock = RwLock::new(stuff);
    let arc = Arc::new(rwlock);
    let local_arc = arc.clone();
    for _ in 0..10{
        let my_rwlock = arc.clone();
        thread::spawn(move || {
            let reader = my_rwlock.read().unwrap();
            // do some stuff
        });
    }
    let mut writer = local_arc.write().unwrap();
    writer.x += 1;
}