Rust 中线程闭包的静态生命周期

问题描述 投票:0回答:1
use std::thread;
fn main() {
   // static NUMBERS: [i32;3] = [1,2,3];
   let numbers = vec![1,2,3];

    thread::scope(|s| {
        s.spawn(move ||{
            for n in &numbers {
                println!("{n}");
            }
        });
        s.spawn(move ||{
            println!("length, {}", numbers.len());
        });
    });

for n in numbers{
    println!("{n}");
}

}

为什么这个特定的代码会给出错误,但使用 NUMBER(注释部分)不会给出错误? 我理解为什么数字会给出错误,因为数字的所有权已移至第一个线程,但在使用静态数字时不应观察到相同的问题,因为根据我对静态生命周期的理解,它只是意味着任何对 NUMBERS 的引用都可以保留到程序结束。

我预计代码也不适用于静态数字,但代码工作得很好

rust closures lifetime
1个回答
0
投票

正如您已经提到的,

static
变量在程序的生命周期内有效。它本质上是只读的,因为您是通过引用访问它,所以没有问题。可变引用需要通过内部可变性进行同步,如
Mutex

另一个需要注意的重要事项是

static
物品无法移动

© www.soinside.com 2019 - 2024. All rights reserved.