Something went wrong. Try again.
Rustlings practice.
Something went wrong. Try again.
1.4 kB · 62 lines
Rust
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263use std::{sync::mpsc, thread, time::Duration};
struct Queue { first_half: Vec<u32>, second_half: Vec<u32>,}
impl Queue { fn new() -> Self { Self { first_half: vec![1, 2, 3, 4, 5], second_half: vec![6, 7, 8, 9, 10], } }}
fn send_tx(q: Queue, tx: mpsc::Sender<u32>) { // Clone the sender `tx` first. let tx_clone = tx.clone(); thread::spawn(move || { for val in q.first_half { println!("Sending {val:?}"); // Then use the clone in the first thread. This means that // `tx_clone` is moved to the first thread and `tx` to the second. tx_clone.send(val).unwrap(); thread::sleep(Duration::from_millis(250)); } });
thread::spawn(move || { for val in q.second_half { println!("Sending {val:?}"); tx.send(val).unwrap(); thread::sleep(Duration::from_millis(250)); } });}
fn main() { // You can optionally experiment here.}
#[cfg(test)]mod tests { use super::*;
#[test] fn threads3() { let (tx, rx) = mpsc::channel(); let queue = Queue::new();
send_tx(queue, tx);
let mut received = Vec::with_capacity(10); for value in rx { received.push(value); }
received.sort(); assert_eq!(received, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); }}