rust代码出现does not live long enough?

作者站长头像
站长
· 阅读数 4
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个回答
avatar
test
2024-06-19

首先 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 在外面能活多久。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容