I am new to Rust. Here is the sample code for the exercise:
Construct a shared_channel.rs program that lets any number of threads share a channel to send in a value and has one receiver that collects all the values. As a hint, use clone() to give each thread access to the sending tx endpoint. (Refer to the example code in Chapter 8/exercises/shared_channel.rs.)
from the book Rust Essentials chapter 8. Concurrency and Parallelism.
I would appreciate comment on the solution I came with:
use std::error::Error;
use std::sync::mpsc::{channel, Sender, Receiver};
use std::thread;
static SENDER_QTY:usize = 20;
type Sending = i32;
type _Sender = Sender<Sending>;
type _Receiver = Receiver<Sending>;
type VecSender = Vec<Sender<Sending>>;
fn main() {
let (sender, reader) = channel();
let senders = make_senders(sender);
send(senders);
read(reader);
}
fn make_senders(sender_to_clone: _Sender) -> VecSender {
let mut result: VecSender = Vec::with_capacity(SENDER_QTY);
for _ in 0..SENDER_QTY {
result.push(sender_to_clone.clone());
}
result
}
fn send(senders: VecSender) {
for sender in &senders {
send_something(sender);
}
}
fn send_something(sender: &_Sender) {
let values = [12, 56, 5, 12];
for i in 0..values.len() - 1 {
let shared_sender = sender.clone();
thread::spawn(move || {
shared_sender.send(values[i]).ok().expect("Unable to send");
});
}
}
fn read(reader: _Receiver) {
loop {
match reader.recv() {
Ok(msg) => println!("Message is: {:?}", msg),
Err(err) => {
match err.cause() {
Some(msg) => println!("Error is: {:?}", msg),
_ => (), // OK, no error, nothing more to read
}
break;
}
}
}
}
Thank you.