Untitled
unknown
plain_text
2 years ago
2.9 kB
2
Indexable
use std::sync::{Arc, Mutex};
use std::sync::mpsc::{channel, Sender};
use std::thread;
use std::thread::JoinHandle;
use std::time::Duration;
struct SingleThreadExecutor<T: Send + 'static > {
sender: Mutex<Sender<Option<T>>>,
close: Mutex<bool>,
sender_close: Mutex<Sender<i32>>,
}
impl<T: Send + 'static + Fn()->() > SingleThreadExecutor<T> {
fn new() -> (Arc<Self>, Option<JoinHandle<()>>) {
let (sender, receiver) = channel::<Option<T>>();
let (sender_close, receiver_close) = channel::<i32>();
let joinhandle = std::thread::spawn(move || {
let mut i = 0;
let mut join = false;
loop {
if let Ok(j) = receiver_close.try_recv() {
//join = true;
//i = receiver.len();
break;
}
match receiver.recv() {
Ok(Some(x)) => {
x();
},
Ok(None) => {
println!("Eseguo stop");
break;
},
Err(_) => {
println!("ciao");
// Gestisci l'errore di ricezione
break;
}
}
}
});
let executor = SingleThreadExecutor {
sender: Mutex::new(sender),
close: Mutex::new(false),
sender_close: Mutex::new(sender_close),
};
(Arc::new(executor), Some(joinhandle))
}
fn submit(&self, t: T) -> Option<()> {
let res = self.sender.lock().unwrap();
let state = self.close.lock().unwrap();
if *state {
return None;
}
(*res).send(Some(t)).unwrap();
Some(())
}
fn close(&self) {
let mut state = self.close.lock().unwrap();
*state = true;
}
fn join(&self){
//let state = self.sender_close.lock().unwrap();
//state.send(1).unwrap();
let cc = self.sender.lock().unwrap();
(*cc).send(None).unwrap();
}
}
fn main() {
let (r, y) = SingleThreadExecutor::new();
let mut join = Vec::new();
let r1 = r.clone();
join.push(std::thread::spawn(move || {
for i in 0..1000 {
println!("Invio task {}", i);
r1.submit(move || { println!("Task {} completato", i); std::thread::sleep(Duration::from_secs(1)); });
}
}));
let r2 = r.clone();
join.push(std::thread::spawn(move || {
std::thread::sleep(Duration::from_micros(0));
println!("Invio stop");
r2.join();
}));
join.push(y.unwrap());
for handle in join {
handle.join().unwrap();
}
}
Editor is loading...