Multithreading 锈迹中的寿命问题:借来的价值寿命不够长
我在下面的简短代码中重现了我的问题 问题:Multithreading 锈迹中的寿命问题:借来的价值寿命不够长,multithreading,rust,lifetime,Multithreading,Rust,Lifetime,我在下面的简短代码中重现了我的问题 问题:内螺纹从外螺纹引用变量v。rust编译器抛出错误,因为“从技术上讲,外线程可能在内线程之前终止,因此内线程可能会失去对变量v的访问。然而,在下面的代码中,这显然不可能发生 问题:我应该如何更改此代码,使其在保持相同功能的同时符合要求 fn main() { //outer thread let v = vec![0, 1]; let test = Test { v: &v }; //inner_thread std::th
内螺纹
从外螺纹
引用变量v
。rust编译器抛出错误,因为“从技术上讲,外线程
可能在内线程
之前终止,因此内线程
可能会失去对变量v
的访问。然而,在下面的代码中,这显然不可能发生
问题:我应该如何更改此代码,使其在保持相同功能的同时符合要求
fn main() { //outer thread
let v = vec![0, 1];
let test = Test { v: &v }; //inner_thread
std::thread::spawn(move || test.print());
loop {
// this thread will never die because it will never leave this loop
}
}
pub struct Test<'a> {
v: &'a Vec<u32>,
}
impl<'a> Test<'a> {
fn print(&self) {
println!("{:?}", self.v);
}
}
显而易见的解决方案是让Test拥有向量,而不是仅仅拥有一个引用 但如果您确实需要借用线程中的值(可能是因为您希望在执行结束后使用它),则可以使用:
为什么您希望测试保持引用而不移动v?真正的解决方案取决于你真正的问题,这里没有显示。解决方案可能是移动、使用静态、使用横梁范围等。
let v = vec![0, 1];
let test = Test { v: &v }; //inner_thread
crossbeam::thread::scope(|scope| {
scope.spawn(|_| test.print());
}).unwrap();