You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
1.1 KiB
39 lines
1.1 KiB
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(); |
|
}
|
|
|