作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试分享 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/
我是一名优秀的程序员,十分优秀!