这是我的问题的一个玩具示例:
use std::sync::{Arc, Mutex};
fn operate_in_chunks(vec: &mut Vec<f32>) {
let chunk_size = 10;
let mutex_vec: Arc<Mutex<&mut Vec<f32>>> = Arc::new(Mutex::new(vec));
let handles = Vec::new();
for chunk in 0..vec.len() / chunk_size {
handles.push(std::thread::spawn(move || {
operate(mutex_vec, chunk);
}));
}
for i in 0..handles.len() {
handles[i].join().unwrap();
}
}
fn operate(mutex_vec: Arc<Mutex<&mut Vec<f32>>>, chunk: usize) {}
我想在传入的结构体上进行一些工作,将其分成多个线程,然后在返回之前将它们全部合并在一起。
我收到的错误信息如下:
error[E0621]: explicit lifetime required in the type of `vec`
--> src/lib.rs:10:22
|
3 | fn operate_in_chunks(vec: &mut Vec<f32>) {
| ------------- help: add explicit lifetime `'static` to the type of `vec`: `&'static mut std::vec::Vec<f32>`
...
10 | handles.push(std::thread::spawn(move || {
| ^^^^^^^^^^^^^^^^^^ lifetime `'static` required
我理解它的投诉内容: 如果线程可能拥有'static'生命周期,并且引用了'vec',那么'vec'必须具有'static'生命周期。然而,在我的使用情况下,理论上应该是可行的:我想要确保线程不具有'static'生命周期,因为它们在函数返回之前都已经加入,此时我不需要在'vec'上使用'static' 生命周期。
Rust是否有一种表达方式 - 将线程的生命周期与'vec'的生命周期统一起来 - 或者所有线程无论如何都是静态的?