gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:50:00 27 4
gpt4 key购买 nike

我正在尝试分享 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 返回后,主线程仍然可以改变 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;
}

关于rust - 如何在没有作用域的情况下使用 RwLocks?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30092272/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com