为什么这个等待线程完成的Rust代码无法正常工作?

约翰

我有一些多线程代码给我带来麻烦。这很简单,就像我可以复制它一样:

use std::thread;
use std::time;
use std::sync::{Arc, atomic::{Ordering, AtomicBool}};
use std::ops::Drop;

struct Container {
    // Join Handle for a thread
    th: Option<thread::JoinHandle<()>>,

    // Gets set to true when we want the thread to exit
    stop_thread: Arc<AtomicBool>,
}

impl Container {
    fn new() -> Self {
        // Create new instance
        let mut inst = Self {
            th: None,
            stop_thread: Arc::new(AtomicBool::new(false)),
        };

        let stop_thread = inst.stop_thread.clone();

        // Start a new thread that does some work
        let t = thread::spawn(move || {
            // Keep doing work until stop_thread gets set to true
            while !stop_thread.load(Ordering::SeqCst) {
                println!("Doing stuff...");

                thread::sleep(time::Duration::from_secs(1));
            }

            println!("Thread exited");
        });

        inst.th = Some(t);
        inst
    }
}

impl Drop for Container {
    fn drop(&mut self) {
        self.stop_thread.store(true, Ordering::SeqCst);

        if let Some(t) = self.th {
            t.join().unwrap();
        }
    }
}

fn main() {
    let c = Container::new();

    thread::sleep(time::Duration::from_secs(3));
    drop(c);
}

这个想法是当Container创建结构的新实例时,将启动一个执行某些操作的后台线程。它一直运行直到实例被销毁为止,这时,我需要通知线程它需要退出。我还需要实际等待线程退出才能继续。

除了drop函数中的代码外,其他所有东西都运行良好鲁斯不满意if let Some(t) = self.th它说:

error[E0507]: cannot move out of `self.th.0` which is behind a mutable reference
  --> src/main.rs:45:26
   |
45 |         if let Some(t) = self.th {
   |                     -    ^^^^^^^ help: consider borrowing here: `&self.th`
   |                     |
   |                     data moved here
   |                     move occurs because `t` has type `JoinHandle<()>`, which does not implement the `Copy` trait

我为什么不能这样做?什么self.th.0

当我尝试接受Rust的建议而做时if let Some(t) = &self.th,它仍然无法编译:

error[E0507]: cannot move out of `*t` which is behind a shared reference
  --> src/main.rs:46:13
   |
46 |             t.join().unwrap();
   |             ^ move occurs because `*t` has type `JoinHandle<()>`, which does not implement the `Copy` trait

我究竟做错了什么?

马哈宁

如此答案中所指定(由Rabbid76链接),可以使用以下.take()函数来解决此问题

impl Drop for Container {
    fn drop(&mut self) {
        self.stop_thread.store(true, Ordering::SeqCst);
        if let Some(t) = self.th.take() {
            t.join().unwrap();
        }
    }
}

尽管您可能想考虑在实现中等待另一个线程drop是否是一个好主意,如此处所述

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么这个等待线程完成的Rust代码无法正常工作?

来自分类常见问题

为什么主线程不等待其他异步进程(线程)完成。allOff无法正常工作

来自分类Dev

为什么我的Java多线程代码无法正常工作?

来自分类Dev

为什么这个繁星点点的代码无法正常工作?

来自分类Dev

为什么这个简单的物理自由落体代码无法正常工作

来自分类Dev

为什么jQuery代码无法正常工作?

来自分类Dev

为什么此代码无法正常工作

来自分类Dev

为什么此代码无法正常工作?

来自分类Dev

为什么我的代码无法正常工作?

来自分类Dev

为什么此代码无法正常工作?

来自分类Dev

为什么在多线程工作时调试无法正常工作

来自分类Dev

为什么这个lua gsub无法正常工作?

来自分类Dev

为什么这个string.search无法正常工作?

来自分类Dev

为什么这个非常简单的JQuery无法正常工作?

来自分类Dev

为什么这个if-else无法正常工作?

来自分类Dev

为什么这个JavaScript无法在Rails中正常工作?

来自分类Dev

为什么这个CSS Gooey无法正常工作?

来自分类Dev

为什么我的异步等待无法正常工作

来自分类Dev

为什么这个简单的线程代码失败?

来自分类Dev

为什么此轮廓检测代码无法正常工作?

来自分类Dev

为什么sscanf在此代码中无法正常工作?

来自分类Dev

为什么代码会消失文件而无法正常工作?

来自分类Dev

为什么我的代码中的fprintf()函数无法正常工作?

来自分类Dev

为什么我的代码无法在同步中正常工作?

来自分类Dev

为什么本月的比较代码无法正常工作?

来自分类Dev

为什么我的代码在此问题中无法正常工作

来自分类Dev

为什么我的pyautogui代码无法正常工作

来自分类Dev

为什么此jQuery chatbot的代码无法正常工作?

来自分类Dev

为什么我的jQuery代码无法正常工作?

Related 相关文章

  1. 1

    为什么这个等待线程完成的Rust代码无法正常工作?

  2. 2

    为什么主线程不等待其他异步进程(线程)完成。allOff无法正常工作

  3. 3

    为什么我的Java多线程代码无法正常工作?

  4. 4

    为什么这个繁星点点的代码无法正常工作?

  5. 5

    为什么这个简单的物理自由落体代码无法正常工作

  6. 6

    为什么jQuery代码无法正常工作?

  7. 7

    为什么此代码无法正常工作

  8. 8

    为什么此代码无法正常工作?

  9. 9

    为什么我的代码无法正常工作?

  10. 10

    为什么此代码无法正常工作?

  11. 11

    为什么在多线程工作时调试无法正常工作

  12. 12

    为什么这个lua gsub无法正常工作?

  13. 13

    为什么这个string.search无法正常工作?

  14. 14

    为什么这个非常简单的JQuery无法正常工作?

  15. 15

    为什么这个if-else无法正常工作?

  16. 16

    为什么这个JavaScript无法在Rails中正常工作?

  17. 17

    为什么这个CSS Gooey无法正常工作?

  18. 18

    为什么我的异步等待无法正常工作

  19. 19

    为什么这个简单的线程代码失败?

  20. 20

    为什么此轮廓检测代码无法正常工作?

  21. 21

    为什么sscanf在此代码中无法正常工作?

  22. 22

    为什么代码会消失文件而无法正常工作?

  23. 23

    为什么我的代码中的fprintf()函数无法正常工作?

  24. 24

    为什么我的代码无法在同步中正常工作?

  25. 25

    为什么本月的比较代码无法正常工作?

  26. 26

    为什么我的代码在此问题中无法正常工作

  27. 27

    为什么我的pyautogui代码无法正常工作

  28. 28

    为什么此jQuery chatbot的代码无法正常工作?

  29. 29

    为什么我的jQuery代码无法正常工作?

热门标签

归档