gpt4 book ai didi

rust - 试图在方法中进行线程联接

转载 作者:行者123 更新时间:2023-12-03 11:45:04 24 4
gpt4 key购买 nike

我有这个代码。它启动一个后台线程并将工作传递给它。我希望能够等待后台线程干净关闭(我知道目前无法停止它,而且我知道它也应该在Drop实现中。我只是在尝试使基本操作顺利进行) )

use std::sync::mpsc;
use std::sync::mpsc::{Receiver, Sender};
use std::thread;
use std::thread::JoinHandle;

pub struct S2 {
jh: JoinHandle<()>,
tx: Sender<i32>,
}

impl S2 {
pub fn new() -> S2 {
let (tx, rx): (Sender<i32>, Receiver<i32>) = mpsc::channel();

let jh = thread::spawn(move || loop {
let item = rx.recv().unwrap();
println!("got {:?}", item)
});
S2 { jh, tx }
}

pub fn queue(&self, item: i32) {
self.tx.send(item).expect("oops");
}

pub fn wait(&mut self) {
self.jh.join().expect("oops");
}
}

fn main() {
let s2 = S2::new();
s2.queue(42);
// s2.jh.join().expect("oops");
}
注释掉的行效果很好。但这将实现细节暴露给调用者。我想要一种方法。但是该方法不会编译。
   Compiling tq3 v0.1.0 (C:\work\rust\tq3)
error[E0507]: cannot move out of `self.jh` which is behind a mutable reference
--> src\main.rs:32:9
|
32 | self.jh.join().expect("oops");
| ^^^^^^^ move occurs because `self.jh` has type `std::thread::JoinHandle<()>`, which does not implement the `Copy` trait
我已经尝试过通常的猜想来满足使用rust 的需要,但到目前为止,还没有找到正确的方法。

最佳答案

定义时的wait函数,

pub fn wait(&mut self) {
self.jh.join().expect("oops");
}
接受对 S2的可变引用。但是 JoinHandle::join占用了句柄(它没有引用,而是一个值)
理解如何解决该错误的关键是考虑 s2.wait()之后S2对象将处于什么状态。
如果您希望对象仍然有效,但其中包含的联接句柄将不再有效,则句柄的类型不能为 JoinHandle<()>,但可以为 Option<JoinHandle<()>>
如果在调用 wait之后该对象不再有效,则可以使 wait接受 self而不是 &mut self
您可以看到两种方法 here的示例。它们确实值得更好的错误处理,尤其是在S3情况下-应该更好地处理对 .wait()的双重调用。 (在我的版本中,您无法在S2上进行两次调用,因为第一次调用消耗了您的实例)。

关于rust - 试图在方法中进行线程联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63240439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com