use std::sync::mpsc; use std::thread; fn main() { let (tx, rx) = mpsc::channel(); let self_tx = tx.clone(); let consumer = thread::spawn(move || { while let Ok(msg) = rx.recv() { println!("Message: {}", msg); if msg > 1000 { // actually, we just need to drop self_tx, otherwise the consumer will keep waiting // for inputs from it, even when tx was already dropped when the producer ended. // the problem with a direct drop is that rustc can't see that it won't be used // anymore. break; } else if msg % 2 == 0 { if self_tx.send(msg * 2).is_err() { println!("Failed to push new value to consumer"); break; }; } } }); let producer = thread::spawn(move || { for i in 1..12 { if tx.send(i).is_err() { println!("Failed to send {}, ending producer", i); break; } } // tx.send(0); }); producer.join().unwrap(); consumer.join().unwrap(); }