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();