rust代码出现does not live long enough?

use std::thread;

fn main() {
    let v = vec![1, 2, 3];

    let mut handles = Vec::new();

    for i in 0..3 {
        let separated_vec_clone = &v;

        handles.push(thread::spawn(move || {
            let data = separated_vec_clone.get(i).unwrap();
        }));
    }

    for handle in handles {
        handle.join().unwrap();
    }
}

各位老师,上面的代码我希望通过多线程去对vec进行一些操作,但是会得到错误说"v does not live long enough"。这里我不是很明白,v的生命周期明明是到main函数结束的,并且我尝试使用Arc解决这个错误,依然会有这个错误。能否麻烦大佬说明一下问题在什么地方,谢谢。

阅读 1.4k
1 个回答

首先 Arc 应该是可以解决你的问题的,代码如下

use std::sync::Arc;
use std::thread;
fn main() {
    let v = Arc::new(vec![1, 2, 3]);
    let mut handles = Vec::new();
    for i in 0..3 {
        let separated_vec_clone = Arc::clone(&v);
        handles.push(thread::spawn(move || {
            let data = separated_vec_clone[i];
            println!("{}", data);
        }));
    }
    for handle in handles {
        handle.join().unwrap();
    }
}

关键在于使用 clone 而不是 borrow(借用)。

然后解释一下你说的 v 生命周期是到 main 结束的地方。我的理解是 rust 编译器应该没法推导(保证) v 在外面能活多久。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进