Untitled
unknown
plain_text
2 years ago
1.3 kB
6
Indexable
use std::fmt::Debug; use std::sync::Arc; use crossbeam::channel::{Receiver, Sender, unbounded}; struct Dispatcher<T: Send + Clone + 'static>{ sender: Sender<T>, receiver: Receiver<T> } struct Subscription<T: Send + Clone + Debug + '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> where T: Debug { return Subscription{ receiver: self.receiver.clone() } } } impl <T: Send + Clone + Debug + '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()); for i in 0..10{ let strcp = str.clone(); threads.push(std::thread::spawn(move || { if i%2==0 { strcp.dispatch(move || "prova"); } else { let subscriber = strcp.subscribe(); subscriber.read(); } })) } }
Editor is loading...