< 返回版块

GuangGuo 发表于 2022-09-27 17:58

报错: self has an anonymous lifetime '_ but it needs to satisfy a 'static lifetime requirement

Foo 起一个线程运行 thread_func, 然后在主线程 join. 这里面有一个矛盾的点, thread_func 为了访问 Foo 的字段需要拿到 &self 或者 &mut self, 但是 rust 编译器就认为, 这不安全, 因为主线程可能先于 thread_func 结束, 所以给 thread_func 的 &self 增加 'static, 但是这又与主线程中 Foo::thread_ 的生命周期矛盾. 所以, 类似的问题该怎么解决呢?

求解惑, 谢谢!

use std::thread::{JoinHandle, self};

fn main() {
    let foo = Foo::new(1, 2);
    foo.start();
    foo.end();
}

struct Foo {
    x: i32,
    y: i32,
    starting: bool,
    thread_: Option<JoinHandle<()>>,
}

impl Foo {
    fn new(x: i32, y: i32) -> Foo {
        Foo { x, y, starting: false, thread_: None }
    }

    fn thread_func(&'static mut self) -> JoinHandle<()> {
        thread::spawn(|| {
            self.x = 1;
            self.y = 2;
        })
    }

    fn start(&mut self) {
        self.starting = true;
        // 这里报错!
        // `self` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
        self.thread_ = Some(self.thread_func());
    }

    fn end(&self) {
        self.starting = false;
        self.thread_.unwrap().join();
    }
}

评论区

写评论
作者 GuangGuo 2022-09-28 09:51

感谢感谢!

--
👇
Grobycn: 多线程用 ArcMutex

作者 GuangGuo 2022-09-28 09:51

感谢解惑, 非常感谢!

--
👇
gwy15: https://doc.rust-lang.org/stable/std/thread/fn.scope.html

作者 GuangGuo 2022-09-28 09:50

感谢解惑, 非常感谢!

--
👇
苦瓜小仔: 多线程和异步编程中,'static 生命周期问题几乎只有一个处理结果:避免借用,使用 Arc 提供的共享所有权。

Arc<Mutex<T>>共享可变状态的基本模式。

局部多线程使用 std::thread::Scope,它不要求 'static

永远不要考虑 &'static mut self&'static self 这种标注 —— 编译器告知你的

but it needs to satisfy a 'static lifetime requirement

仅仅表明你违反了 spawn 的 trait bound,不假思索地标注 'static 很少真正解决问题。

pub fn spawn<F, T>(f: F) -> JoinHandle<T> 
where
    F: FnOnce() -> T,
    F: Send + 'static,
    T: Send + 'static, 
苦瓜小仔 2022-09-27 23:28

多线程和异步编程中,'static 生命周期问题几乎只有一个处理结果:避免借用,使用 Arc 提供的共享所有权。

Arc<Mutex<T>>共享可变状态的基本模式。

局部多线程使用 std::thread::Scope,它不要求 'static

永远不要考虑 &'static mut self&'static self 这种标注 —— 编译器告知你的

but it needs to satisfy a 'static lifetime requirement

仅仅表明你违反了 spawn 的 trait bound,不假思索地标注 'static 很少真正解决问题。

pub fn spawn<F, T>(f: F) -> JoinHandle<T> 
where
    F: FnOnce() -> T,
    F: Send + 'static,
    T: Send + 'static, 
gwy15 2022-09-27 19:46

https://doc.rust-lang.org/stable/std/thread/fn.scope.html

Grobycn 2022-09-27 19:13

多线程用 ArcMutex

1 共 6 条评论, 1 页