diff --git a/src/lib.rs b/src/lib.rs index 1f90f15..16aab56 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,10 +1,13 @@ -use std::{sync::mpsc, thread}; +use std::{ + sync::{mpsc, Arc, Mutex}, + thread, +}; pub struct ThreadPool { workers: Vec, sender: mpsc::Sender, } - +type Job = Box; impl ThreadPool { /// Create a new ThreadPool. /// @@ -15,12 +18,13 @@ impl ThreadPool { /// The `new` function will panic if the size is zero. pub fn new(size: usize) -> ThreadPool { assert!(size > 0); - let (sender, reciever) = mpsc::channel(); + 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, sender } @@ -30,18 +34,25 @@ impl ThreadPool { where F: FnOnce() + Send + 'static, { + let job = Box::new(f); + self.sender.send(job).unwrap(); } } -struct Job; struct Worker { id: usize, thread: thread::JoinHandle<()>, } impl Worker { - pub fn new(id: usize) -> Worker { - let thread = thread::spawn(|| {}); + pub fn new(id: usize, receiver: Arc>>) -> Worker { + let thread = thread::spawn(move || { + let job = receiver.lock().unwrap().recv().unwrap(); + + println!("Worker {id} got a job; executing...."); + + job(); + }); Worker { id, thread } } }