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个回答
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 在外面能活多久。
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容