我不明白为什么下面的代码会失败
use std::sync::{Arc};
use futures::lock::Mutex;
struct A<'a>{
a: &'a u8
}
impl<'a> A<'a>{
pub fn run(a: Arc<Mutex<Self>>) {
let stack_thread = std::thread::Builder::new()
.spawn(move || {
let a = a.clone();
}).unwrap();
}
}错误:
error[E0477]: the type `[closure@src/lib.rs:11:20: 13:14]` does not fulfill the required lifetime
--> src/lib.rs:11:14
|
11 | .spawn(move || {
| ^^^^^
|
= note: type must satisfy the static lifetime其实我有个主意。如果我使用A的生命周期并删除a成员,它就能工作。因此,它可能是在派生线程中拒绝a: Arc<Mutex<Self>>。生成线程时,闭包必须具有静态生存期:
pub fn spawn<F, T>(f: F) -> JoinHandle<T>
where F: FnOnce() -> T,
F: Send + 'static,
T: Send + 'static因此,看起来a是在闭包内部传递的,这使得闭包不是'static。但我不明白为什么,因为线程中的a: Arc<Mutex<Self>>的寿命与闭包一样长。有人能详细解释一下发生了什么吗?我混淆了一生的事情和一生的参考资料,等等。
发布于 2021-05-14 21:29:06
虽然Arc<Mutex<Self>>被移动到闭包中,并且只要闭包还活着(删除闭包就会删除Arc),这还不够。正如您在文档中所看到的,新生成的线程可能永远存在('static),它要求传入的闭包为'static。但是仅仅将一些东西封装到一个Arc中并不能使它成为'static
如果我给您一些通用的A<'a>,作为Arc<Mutex<Self>>的一部分,使用任何生命周期'a,那么生命周期'a可能比'static短。如果将此A<'a>放入Arc并传递给它,则对生命周期'a (本例中的a-member )的破坏将使A、Mutex<A>和Arc<Mutex<A>>无效。
实际上,泛型生命周期不能通过将它们封装在原子原语中来“解决”,因为它们不能对其居民强制执行'static生命周期。
你要找的是
impl A<'static>{
pub fn run(a: Arc<Mutex<Self>>) {
let stack_thread = std::thread::Builder::new()
.spawn(move || {
let a = a.clone();
}).unwrap();
}
}或者在任何情况下都需要将A的定义更改为'static,例如,保存Box<[u8]>而不是&'a [u8]。
https://stackoverflow.com/questions/67540892
复制相似问题