rust - 如何正确退出 mpsc::Receiver 上的线程阻塞

标签 rust channel

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 的情况下,它将被唤醒并产生一个错误,在这种情况下,我正在打破上面的无限和阻塞循环。但是,我如何明确地使用 channel 的这个属性,而不求助于与 try_recv() 等结合的其他标志,并确定地干净地退出我的线程?

最佳答案

为什么不发送特定消息来关闭此线程?我不知道你的数据是什么,但大多数时候它可能是一个枚举,并在你的接收中添加一个枚举变体,如“MyData::Shutdown”,你可以简单地跳出循环。

关于rust - 如何正确退出 mpsc::Receiver 上的线程阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31746716/

相关文章:

objective-c - 如何在 Rust 中调用 Swift 函数?

rust - 当 Iterator::map 返回 Result::Err 时,如何停止迭代并返回错误?

go - 在 select{case :channel} 中更改 channel

go - 等待例程完成的正确方法

rust - `mem::swap` ing a `Mutex<T>` 真的安全吗?

rust - 如何在声明性宏中生成特征边界?

rust - 如何在 Rust 中链接返回结果的函数?

go - 如何测试 channel 是否关闭并且仅在未关闭时发送给它

go - 同时收听一系列 go channel