As referências de encadeamento requerem vida estática?
Embora faça sentido intuitivamente que as referências passadas para threads gerados precisem ter vida estática, não sei ao certo o que exatamente está fazendo o seguinte código não ser compilado:
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));
}
}
}
Compilar este pequeno programa fornece o seguinte erro:
$ 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...
Parece-me que a variávela
vai sobreviverc_clone
, o que importa neste caso ...? Espero que alguém possa me ajudar a entender o que estou perdendo!