Rust 关闭一个频道,比如围棋

Rust 关闭一个频道,比如围棋,rust,channel,Rust,Channel,锈有一种“封闭”通道的方式吗 其思想是在通道上迭代(连续接收),直到通道指示它不会产生更多的值 use std::sync::{Arc, Mutex}; use std::thread; use std::sync::mpsc; fn main() { let data = Arc::new(Mutex::new(0u32)); let (tx, rx) = mpsc::channel::<u32>(); { let (data, tx) =

锈有一种“封闭”通道的方式吗

其思想是在通道上迭代(连续接收),直到通道指示它不会产生更多的值

use std::sync::{Arc, Mutex};
use std::thread;
use std::sync::mpsc;

fn main() {
    let data = Arc::new(Mutex::new(0u32));
    let (tx, rx) = mpsc::channel::<u32>();
    {
        let (data, tx) = (data.clone(), tx.clone());
        thread::spawn(move || {
            for _ in 0..10 {
                let mut data = data.lock().unwrap();
                *data += 1;
                tx.send(*data).unwrap();
            }
            // *** How could I close the channel here, to signal the work is done?
        });
    }

    // *** How can I detect a closed channel here? Pattern matching?
    for _ in 0..10 {
        let x = rx.recv().unwrap();
        println!("{}", x);
    }
}
使用std::sync::{Arc,Mutex};
使用std::线程;
使用std::sync::mpsc;
fn main(){
让data=Arc::new(Mutex::new(0u32));
let(tx,rx)=mpsc::channel::();
{
let(data,tx)=(data.clone(),tx.clone());
线程::生成(移动| |{
对于0..10中的uu{
让mut data=data.lock().unwrap();
*数据+=1;
发送(*数据).unwrap();
}
//***我如何关闭此处的频道,以表示工作已完成?
});
}
//***如何在此处检测闭合通道?模式匹配?
对于0..10中的uu{
设x=rx.recv().unwrap();
println!(“{}”,x);
}
}

当所有发送方都已丢弃时,频道将关闭。在您的代码中,您克隆每个线程并为每个线程提供一个线程,这些线程在线程结束时会自动删除。最后一个发送方在主线程中,您应该在所有线程生成后立即删除它:
drop(tx)

最后,最简单的接收方式是在
拖放(tx)
之后


这个循环在通道关闭时结束。

你有任何代码来表示你正在尝试做的事情吗?@tadman[一个相当愚蠢的]示例补充道,文档已经回答了这个问题:删除
tx
(自从作用域结束后,在for循环之后发生这种情况)将导致
rx
在下一次
recv
上返回
Err
而不是
Ok
。然后,您可以对
recv
的结果进行模式匹配,以检查
Ok
Err
。这正是我所需要的!这里是一个在操场上的简化工作示例:这很酷,但却是一种极其浪费的迭代方式(它也是一个操作系统线程),因此我在Rust中没有看到太多。在这种情况下,这绝对是浪费——只是一个示例。根据线程中的资源,它可能会有所不同?
for elt in rx {
    /* */
}