我正在try 编写一个与Run关联的方法,该方法将启动一个新线程并在那里继续运行.线程句柄保存在 struct 属性中,但我收到以下错误:

error[E0521]: borrowed data escapes outside of method                                                                                                                                                                                                                                                              
  --> src\server\dispatcher.rs:33:27
   |
28 |       pub fn run(&mut self) {
   |                  ---------
   |                  |
   |                  `self` is a reference that is only valid in the method body
   |                  let's call the lifetime of this reference `'1`
...
33 |           let main_thread = thread::spawn(move || loop {
   |  ___________________________^
34 | |             match rx.try_recv() {
35 | |                 Ok(_) | Err(TryRecvError::Disconnected) => {
36 | |                     break;
...  |
43 | |             }
44 | |         });
   | |          ^
   | |          |
   | |__________`self` escapes the method body here
   |            argument requires that `'1` must outlive `'static`
   |

我的代码:

pub fn run(&mut self) {
    let (tx, rx) = mpsc::channel::<()>();

    let packets = Arc::new(Mutex::new((&self.packets)));

    let main_thread = thread::spawn(move || loop {
        match rx.try_recv() {
            Ok(_) | Err(TryRecvError::Disconnected) => {
                break;
            }
            Err(TryRecvError::Empty) => {
                let inside = packets.clone();

                let qwe = packets.lock().unwrap();
            }
        }
    });

    self.main_thread = Some(main_thread);
}

推荐答案

该解决方案可能会以某种方式使用thread::scope().

您正在生成一个捕获packets的线程,其中包含对self的引用(指针).据编译器所知,当程序结束时,您的线程可能仍在运行,在被释放很长一段时间后仍在访问self.

如果您改为从作用域中派生线程,则编译器知道当作用域结束时它将被联接(等待).您也可以在示波器结束时发送停止信号.

继续的方式有多种 Select .您可以在外部创建作用域并将其传递给run().或者,您可以将一个额外的lambda传递给run(),该lambda包含您希望在创建线程后执行的代码,因此您不必将任何特定于线程的内容存储到self中.或者,您可以不在线程内使用任何引用,而让它拥有它通过队列获得的任何东西.

Rust相关问答推荐

将已知大小的切片合并成一个数组,

从Rust调用C++虚拟方法即使在成功执行之后也会引发Access违规错误

使用Rust s serde_json对混合数据类型进行优化'

我怎样才能从一个Rust 的日期中go 掉3年?

在自身功能上实现类似移动的行为,以允许通过大小的所有者进行呼叫(&;mut;self)?

如何使用syn插入 comments ?

为什么允许我们将可变引用转换为不可变引用?

在Rust中,在实现特征`Display`时,如何获取调用方指定的格式?

铁 rust ,我的模块介绍突然遇到了一个问题

在Rust中判断编译时是否无法访问

由于生存期原因,返回引用的闭包未编译

为什么BufReader实际上没有缓冲短寻道?

UnsafeCell:它如何通知 rustc Select 退出基于别名的优化?

从 rust 函数返回 &HashMap

Rust LinkedList 中的borrow 判断器错误的原因是什么?

为什么需要静态生命周期以及在处理 Rust 迭代器时如何缩小它?

如何从borrow 的异步代码运行阻塞代码?

通过mem::transmute将数组展平安全吗?

如何从 rust 中的同一父目录导入文件

Rustlings 切片原语