Multithreading 为什么这个变量定义意味着静态寿命?

Multithreading 为什么这个变量定义意味着静态寿命?,multithreading,concurrency,rust,lifetime,Multithreading,Concurrency,Rust,Lifetime,我试图在向量块上执行一个函数,然后使用消息传递库将结果发送回 但是,我得到一个关于向量生命周期的奇怪错误,该向量甚至没有参与线程操作: src/lib.rs:153:27: 154:25 error: borrowed value does not live long enough src/lib.rs:153 let extended_segments = (segment_size..max_val) error: src/lib.rs:154 .collect::<Vec

我试图在向量块上执行一个函数,然后使用消息传递库将结果发送回

但是,我得到一个关于向量生命周期的奇怪错误,该向量甚至没有参与线程操作:

src/lib.rs:153:27: 154:25 error: borrowed value does not live long enough
src/lib.rs:153   let extended_segments = (segment_size..max_val)
error: src/lib.rs:154     .collect::<Vec<_>>()borrowed value does not live long enough

note: reference must be valid for the static lifetime...:153
  let extended_segments = (segment_size..max_val)
src/lib.rs:153:3: 155:27: 154     .collect::<Vec<_>>()
note: but borrowed value is only valid for the statement at 153:2:
reference must be valid for the static lifetime...
src/lib.rs:
let extended_segments = (segment_size..max_val)
consider using a `let` binding to increase its lifetime
src/lib.rs:153:27:154:25错误:借用的值寿命不够长
src/lib.rs:153 let extended_segments=(segment_size..max_val)
错误:src/lib.rs:154.collect::()借用值的有效期不够长
注意:引用必须在静态生存期内有效…:153
设扩展段=(段大小..最大值)
src/lib.rs:153:3:155:27:154.收集::()
注:但借用值仅对153:2的语句有效:
引用必须在静态生存期内有效。。。
src/lib.rs:
设扩展段=(段大小..最大值)
考虑使用“让”绑定来增加它的生命周期。
我试着在迭代器周围移动,并在不同的位置添加生命周期,但我无法让检查器通过并仍然保持类型

下面是基于的错误代码。(完整代码位于。)

使用std::sync::mpsc;
使用std::线程;
fn筛网U段(a:&[usize],b:&[usize])->Vec{
vec![]
}
fn eratosthenes_筛(val:usize)->Vec{
vec![]
}
pub fn分段筛网(最大值:usize,多段尺寸:usize)->Vec{
如果最大值((最大值为f64)。sqrt()为usize){
段大小=(最大值为f64).sqrt()为usize;
println!(“段大小大于√{}。减少到{}以减少资源使用。“,
马克斯·瓦尔,
段(单位尺寸);
}
设小素数=eratosthenes筛((最大值为f64).sqrt()为usize);
设mut big_primes=small_primes.clone();
let(tx,rx):(mpsc::发送方,mpsc::接收方)=mpsc::信道();
设扩展段=(段大小..最大值)
收集::()
.块(段大小);
对于扩展\u段中的此\u段。克隆(){
设small_primes=small_primes.clone();
设tx=tx.clone();
线程::生成(移动| |{
设筛分_段=筛分_段(&小_素数,此_段);
发送(筛选的_段)。展开();
});
}
对于1..extended_segments.count()中的u{
大素数扩展(&rx.recv().unwrap());
}
大素数
}
fn main(){}

我如何理解和避免这个错误?我不确定如何使线程闭包的生命周期保持不变,并且仍然使函数可重用(即,不
main()
)。我不知道如何“消费所有进入[结束]的东西”,如中所述。我不确定在哪里可以确保所有引用都变成移动,我也不确定我是否想这样做。

当试图重现一个问题时,我鼓励您通过删除所有不相关的代码来创建一个。在这种情况下,类似这样的情况似乎会产生相同的错误:

fn segmented_sieve_parallel(max_val: usize, segment_size: usize) {
    let foo = (segment_size..max_val)
        .collect::<Vec<_>>()
        .chunks(segment_size);
}

fn main() {}
生命周期标记
'a
让您知道迭代器包含对某些内容的引用。终身省略已从函数中删除
'a
,如下所示:

fn chunks<'a>(&'a self, size: usize) -> Chunks<'a, T>
虽然我会把它写成

fn segmented_sieve_parallel(max_val: usize, segment_size: usize) {
    let foo: Vec<_> = (segment_size..max_val).collect();
    let bar = foo.chunks(segment_size);
}

fn main() {}
fn chunks<'a>(&'a self, size: usize) -> Chunks<'a, T>
fn segmented_sieve_parallel(max_val: usize, segment_size: usize) {
    let foo = (segment_size..max_val)
        .collect::<Vec<_>>();
    let bar = foo.chunks(segment_size);
}

fn main() {}
fn segmented_sieve_parallel(max_val: usize, segment_size: usize) {
    let foo: Vec<_> = (segment_size..max_val).collect();
    let bar = foo.chunks(segment_size);
}

fn main() {}
for this_segment in extended_segments.clone() {
    let this_segment = this_segment.to_vec();
    // ...
}