Untitled

 avatar
unknown
plain_text
2 years ago
2.1 kB
4
Indexable
use std::collections::HashMap;
use std::sync::{Arc, Mutex};
use std::sync::mpsc::{channel, Receiver, Sender};

struct Joiner{
    senders: Arc<Vec<Sender<f64>>>,
    receivers: Vec<Receiver<f64>>
}

struct SingleJoiner{
    num_threads: usize,
    senders: Mutex<Arc<Vec<Sender<f64>>>>,
    receiver: Receiver<f64>
}

impl Joiner {
    fn new(n: usize) -> Self{
        let mut listsenders = Vec::new();
        let mut listreceivers = Vec::new();
        for i in 0..n{
            let (sender, receiver) = channel();
            listreceivers.push(receiver);
            listsenders.push(sender);
        }
        return Joiner{
            senders: Arc::new(listsenders),
            receivers: listreceivers
        }
    }
}

impl SingleJoiner {
    fn new(senders: Mutex<Arc<Vec<Sender<f64>>>>, receiver: Receiver<f64>, num_threads: usize) -> Self{
        return SingleJoiner{
            num_threads,
            senders,
            receiver
        }
    }

    fn supply(&self, num_thread: usize) -> HashMap<usize, f64>{
        let mut res = HashMap::new();
        //genero valore
        let val = 1.064;
        //invio sui canali tranne il mio
        let lock = self.senders.lock().unwrap();
        for i in 0..self.num_threads{
            if i != num_thread{
                lock[i].send(val);
            }
        }

        for i in 0..self.num_threads-1{
            res.insert(i, self.receiver.recv().unwrap());
        }

        return res;
    }
}

fn main() {
    let mut threads = Vec::new();

    let mut joiner = Joiner::new(3);

    for i in 0..3{
        let singlejoiner = SingleJoiner::new(Mutex::new(joiner.senders.clone()), joiner.receivers.pop().unwrap(), 3);
        threads.push(std::thread::spawn(move || {
            for j in 0..10{
                let res = singlejoiner.supply(i);
                println!("Il thread {}, al ciclo {}, ha stampato: {:?}", i, j, res);
            }
        }))
    }

    for i in threads{
        i.join().unwrap();
    }

}
Editor is loading...