线程引用需要静态生命周期?
Thread references require static lifetime?
虽然直觉上传递给派生线程的引用需要具有静态生命周期是有道理的,但我不清楚到底是什么导致以下代码无法编译:
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
和 Mutex
包装是多余的:您传递的是对本地堆栈上某些内容的引用。当您使用 std::thread::spawn
生成线程时,没有任何生命周期链接在一起;主线程完全可以自由地结束并释放其中的任何东西——在这种情况下,包括 a
——在它产生的任何其他线程甚至 start 执行之前;因此,在这种情况下,a
可以在生成的线程执行任何操作时引用已释放的内存,从而将 c_clone
作为悬空指针。这就是为什么生成线程的关闭环境必须是 'static
.
虽然直觉上传递给派生线程的引用需要具有静态生命周期是有道理的,但我不清楚到底是什么导致以下代码无法编译:
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
和 Mutex
包装是多余的:您传递的是对本地堆栈上某些内容的引用。当您使用 std::thread::spawn
生成线程时,没有任何生命周期链接在一起;主线程完全可以自由地结束并释放其中的任何东西——在这种情况下,包括 a
——在它产生的任何其他线程甚至 start 执行之前;因此,在这种情况下,a
可以在生成的线程执行任何操作时引用已释放的内存,从而将 c_clone
作为悬空指针。这就是为什么生成线程的关闭环境必须是 'static
.