我制作了以下程序:
use std::process;
use std::sync::mpsc;
use std::thread;
use std::time::Duration;
fn main() {
let (tx, rx) = mpsc::channel();
let t1 = thread::spawn(move || {
for i in 0..10 {
if i != 9 {
let msg = i32::from(i);
tx.send(msg).unwrap();
} else {
println!("Greetings from process {} of 10!", i);
for received in rx.iter().take(10) {
println!("Greetings from process {} of 10!", received);
thread::sleep(Duration::from_secs(1));
}
process::exit(1);
}
}
});
t1.join().unwrap();
}
程序永远不会结束;它执行所有的代码,但从不结束。有人能帮我吗?
问题是Receiver
上的iter()
是一个阻塞调用。因此,由于CCD_;挂断";然而,它仍将被阻止,因为您只发送过9
消息。如果尝试take()
9
或更少(即最多发送什么(,则for循环将按预期结束。
或者,您可以(1(使用try_iter()
,这将在没有更多挂起的值时停止迭代,或者(2(您需要";挂断";进入for循环之前的Sender
,可以通过调用drop(tx)
来完成。
} else {
drop(tx);
// ^^^^^^^^
println!("Greetings from process {} of 10!", i);
for received in rx.iter().take(10) {
println!("Greetings from process {} of 10!", received);
thread::sleep(Duration::from_secs(1));
}
process::exit(1);
}
或
} else {
println!("Greetings from process {} of 10!", i);
for received in rx.try_iter().take(10) {
// ^^^^^^^^
println!("Greetings from process {} of 10!", received);
thread::sleep(Duration::from_secs(1));
}
process::exit(1);
}
这当然是忽略了这样一个事实,即你试图做的事情有点令人困惑,比如线程为什么要向自己发送/接收。然而,这将解决";不退出";问题