|
|
@@ -1,28 +1,39 @@ |
|
|
|
use std::thread; |
|
|
|
use std::sync::{mpsc, Mutex, Arc}; |
|
|
|
|
|
|
|
pub struct ThreadPool{ |
|
|
|
workers: Vec<Worker>, |
|
|
|
sender: mpsc::Sender<Job>, |
|
|
|
} |
|
|
|
|
|
|
|
type Job = Box<dyn FnOnce() + Send + 'static>; |
|
|
|
|
|
|
|
impl ThreadPool { |
|
|
|
pub fn new(size: usize) -> ThreadPool { |
|
|
|
assert!(size > 0); |
|
|
|
|
|
|
|
let (sender, receiver) = mpsc::channel(); |
|
|
|
|
|
|
|
let receiver = Arc::new(Mutex::new(receiver)); |
|
|
|
|
|
|
|
let mut workers = Vec::with_capacity(size); |
|
|
|
|
|
|
|
for id in 0..size { |
|
|
|
workers.push(Worker::new(id)); |
|
|
|
workers.push(Worker::new(id, Arc::clone(&receiver))); |
|
|
|
} |
|
|
|
|
|
|
|
ThreadPool { |
|
|
|
workers |
|
|
|
workers, |
|
|
|
sender, |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
pub fn execute<F>(&self, f: F) |
|
|
|
where F: FnOnce() + Send + 'static { |
|
|
|
|
|
|
|
where F: FnOnce() + Send + 'static |
|
|
|
{ |
|
|
|
let job = Box::new(f); |
|
|
|
self.sender.send(job).unwrap(); |
|
|
|
} |
|
|
|
|
|
|
|
// pub fn spawn<F, T>(f: F) -> JoinHandle<T> |
|
|
@@ -41,8 +52,16 @@ struct Worker { |
|
|
|
} |
|
|
|
|
|
|
|
impl Worker { |
|
|
|
fn new(id: usize) -> Worker { |
|
|
|
let thread = thread::spawn(|| {}); |
|
|
|
fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker { |
|
|
|
let thread = thread::spawn(move || { |
|
|
|
loop { |
|
|
|
let job = receiver.lock().unwrap().recv().unwrap(); |
|
|
|
|
|
|
|
println!("Worker {} got a job, executing.", id); |
|
|
|
|
|
|
|
job(); |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
Worker { |
|
|
|
id, |