【发布时间】:2015-10-23 03:57:39
【问题描述】:
impl A {
fn new() -> (A, std::sync::mpsc::Receiver<Data>) {
let (sender, receiver) = std::sync::mpsc::channel();
let objA = A { sender: sender, }; // A spawns threads, clones and uses sender etc
(objA, receiver)
}
}
impl B {
fn new() -> B {
let (objA, receiver) = A::new();
B {
a: objA,
join_handle: Some(std::thread::spwan(move || {
loop {
match receiver.recv() {
Ok(data) => /* Do Something, inform main thread etc */,
Err(_) => break,
}
}
})),
}
}
}
impl Drop for B {
fn drop(&mut self) {
// Want to do something like "sender.close()/receiver.close()" etc so that the following
// thread joins. But there is no such function. How do i break the following thread ?
self.join_handle().take().unwrap().join().unwrap();
}
}
在这种情况下有没有办法干净地退出?问题是,当接收者或发送者中的任何一个被丢弃时,另一个会嗅到这个并给出错误。在receiver 的情况下,它将被唤醒并产生错误,在这种情况下,我将跳出上面的无限和阻塞循环。但是,我如何明确地使用通道的这个属性来做到这一点,而不使用与try_recv()etc 一起使用的其他标志,并确定性地干净地退出我的线程?
【问题讨论】: