报错: 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();
}
}
1
共 6 条评论, 1 页
评论区
写评论感谢感谢!
--
👇
Grobycn: 多线程用
Arc
和Mutex
感谢解惑, 非常感谢!
--
👇
gwy15: https://doc.rust-lang.org/stable/std/thread/fn.scope.html
感谢解惑, 非常感谢!
--
👇
苦瓜小仔: 多线程和异步编程中,
'static
生命周期问题几乎只有一个处理结果:避免借用,使用Arc
提供的共享所有权。Arc<Mutex<T>>
是共享可变状态的基本模式。局部多线程使用
std::thread::Scope
,它不要求'static
。永远不要考虑
&'static mut self
和&'static self
这种标注 —— 编译器告知你的仅仅表明你违反了
spawn
的 trait bound,不假思索地标注 'static 很少真正解决问题。多线程和异步编程中,
'static
生命周期问题几乎只有一个处理结果:避免借用,使用Arc
提供的共享所有权。Arc<Mutex<T>>
是共享可变状态的基本模式。局部多线程使用
std::thread::Scope
,它不要求'static
。永远不要考虑
&'static mut self
和&'static self
这种标注 —— 编译器告知你的仅仅表明你违反了
spawn
的 trait bound,不假思索地标注 'static 很少真正解决问题。https://doc.rust-lang.org/stable/std/thread/fn.scope.html
多线程用
Arc
和Mutex