如何在没有作用域的情况下使用 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;
}
我试图在不使用作用域线程的情况下在多个线程之间共享一个 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;
}