Untitled

 avatar
unknown
plain_text
2 years ago
2.0 kB
2
Indexable
use std::fmt::Debug;
use std::sync::Arc;
use crossbeam::channel::{Receiver, Sender, unbounded};
use std::time::Duration;

struct Dispatcher<T: Send + Clone + 'static>{
    sender: Sender<T>,
    receiver: Receiver<T>
}

struct Subscription<T: Send + Clone + 'static>{
    receiver: Receiver<T>
}

impl<T: Send + Clone + 'static> Dispatcher<T> {
    fn new() -> Self{
        let (sender, receiver) = unbounded();
        return Dispatcher{
            sender,
            receiver
        }
    }

    fn dispatch(&self, msg: T){
        self.sender.send(msg);
    }

    fn subscribe(&self) -> Subscription<T> {
        return Subscription{
            receiver: self.receiver.clone()
        }
    }
}

impl <T: Send + Clone  + 'static> Subscription<T>{
    fn read(&self) -> Option<T>{
        let res = self.receiver.recv().unwrap();
        return Some(res);
    }
}


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

    let s1 = str.clone();
    threads.push(std::thread::spawn(move || {
        std::thread::sleep(Duration::from_secs(2));
        for i in 0..30 {
            let s = format!("prova {}", i);
            s1.dispatch(s);
        }
    }));




    for i in 0..3 {
        let s2 = str.clone();
        threads.push(std::thread::spawn(move || {
            let s = s2.subscribe();
            for j in 0..10 {
                let d = s.read();
                println!("stampa {:?} al ciclo {} dal thread {}", d, j, i);
            }
        }));
    }





    /*
    for i in 0..10{
        let strcp = str.clone();
        threads.push(std::thread::spawn(move || {
            if i%2==0 {
                strcp.dispatch("prova ");
            } else {
                let subscriber = strcp.subscribe();
                let d = subscriber.read();
                println!("{:?} al ciclo {}", d, i);
            }
        }))
    }
*/
    for i in threads {
        i.join().unwrap();
    }
}
Editor is loading...