fn count_digits(n:i32)->i32 { if n==0 {1} else {n.ilog10() as i32+1} } use std::sync::mpsc::{self, Receiver, Sender}; struct Job { n: i32 } struct Result { n: i32, digits: i32 } fn worker(jobs: Receiver, results: Sender) { for job in jobs { if job.n < 0 { break; } results.send(Result { n: job.n, digits: count_digits(job.n) }).unwrap(); } } fn main() { let n=std::thread::available_parallelism().map_or(1,usize::from); let (results_tx,results_rx)=mpsc::channel(); let mut jobs=Vec::new();let mut ids=Vec::new(); for _ in 0..n { let (tx,rx)=mpsc::channel(); let results=results_tx.clone(); jobs.push(tx);ids.push(std::thread::spawn(move || worker(rx,results))); } for i in 0..8 { jobs[i % n].send(Job {n:1 << (i*3)}).unwrap(); } for queue in &jobs { queue.send(Job {n:-1}).unwrap(); } let mut total=0; for _ in 0..8 { let r=results_rx.recv().unwrap();total+=r.digits; } for id in ids { id.join().unwrap(); } println!("{n} workers, {total} digits in total"); }