问题
Here's the code:
use std::thread;
use std::sync::mpsc;
fn main() {
//spawn threads
let (tx, rx) = mpsc::channel();
for mut i in 0 .. 10 {
let txc = tx.clone(); //clone from the main sender
thread::spawn( move || {
i += 20;
println!("Sending: {}", i);
txc.send(i).unwrap_or_else(|e| {
eprintln!("{}", e);
});
});
}
for received in rx {
println!("Received: {}", received);
}
}
The code runs successfully but it hangs and the process never exits at the end.
I thought it could be related to closing the channel ends and I tried dropping by tx.drop()
and rx.drop()
but the compiler gave an error.
What am I doing wrong here?
回答1:
tx
in your main thread is not dropped until the end of the main
function, and rx
will not be closed until all senders have been dropped.
To fix this, you can manually drop it with drop(tx)
after you have started all of your threads:
use std::thread;
use std::sync::mpsc;
fn main() {
//spawn threads
let (tx, rx) = mpsc::channel();
for mut i in 0 .. 10 {
let txc = tx.clone(); //clone from the main sender
thread::spawn( move || {
i += 20;
println!("Sending: {}", i);
txc.send(i).unwrap_or_else(|e| {
eprintln!("{}", e);
});
});
}
// drop tx manually, to ensure that only senders in spawned threads are still in use
drop(tx);
for received in rx {
println!("Received: {}", received);
}
}
来源:https://stackoverflow.com/questions/61364917/process-never-exits-after-successfully-receiving-from-mpsc-channel