首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成弧互斥线程时的生存期问题

生成弧互斥线程时的生存期问题
EN

Stack Overflow用户
提问于 2021-05-14 21:02:01
回答 1查看 349关注 0票数 0

我不明白为什么下面的代码会失败

代码语言:javascript
复制
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();
    }
}

错误:

代码语言:javascript
复制
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>>。生成线程时,闭包必须具有静态生存期:

代码语言:javascript
复制
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>>的寿命与闭包一样长。有人能详细解释一下发生了什么吗?我混淆了一生的事情和一生的参考资料,等等。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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 )的破坏将使AMutex<A>Arc<Mutex<A>>无效。

实际上,泛型生命周期不能通过将它们封装在原子原语中来“解决”,因为它们不能对其居民强制执行'static生命周期。

你要找的是

代码语言:javascript
复制
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]

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67540892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档