线程引用需要静态生命周期吗?

2023-12-28

虽然直观上讲,传递给生成线程的引用需要具有静态生命周期,但我不清楚到底是什么导致以下代码无法编译:

use std::sync::Arc;
use std::sync::Mutex;

struct M;

fn do_something(m : Arc<Mutex<&M>>) {
    println!("Ha, do nothing!");
}

fn main() {
    let a = M;
    {
        let c : Arc<Mutex<&M>> = Arc::new(Mutex::new(&a));
        for i in 0..2 {
            let c_clone = c.clone();
            ::std::thread::spawn(move || do_something(c_clone));
        }
    }
}

编译这个小程序会出现以下错误:

$ rustc -o test test.rs
test.rs:13:55: 13:56 error: `a` does not live long enough
test.rs:13         let c : Arc<Mutex<&M>> = Arc::new(Mutex::new(&a));
                                                             ^
note: reference must be valid for the static lifetime...

在我看来,变量a将会过时c_clone,在这种情况下最重要的是......?希望有人能帮助我理解我所缺少的!


从本质上讲,Arc and Mutex包装是多余的:您正在传递对本地堆栈上某些内容的引用。当你生成一个线程时std::thread::spawn,没有任何东西将生命周期连接在一起;主线程完全可以自由地结束并释放其中的任何内容 - 在这种情况下,包括a- 在它产生任何其他线程之前start执行;因此在这种情况下a当生成的线程执行任何操作时,可以引用已释放的内存,从而留下c_clone作为悬空指针。这就是为什么派生线程的关闭环境必须是'static.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程引用需要静态生命周期吗? 的相关文章

随机推荐