Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. use std::thread;
  2. use std::sync::{mpsc, Mutex, Arc};
  3. pub struct ThreadPool{
  4. workers: Vec<Worker>,
  5. sender: mpsc::Sender<Job>,
  6. }
  7. type Job = Box<dyn FnOnce() + Send + 'static>;
  8. impl ThreadPool {
  9. pub fn new(size: usize) -> ThreadPool {
  10. assert!(size > 0);
  11. let (sender, receiver) = mpsc::channel();
  12. let receiver = Arc::new(Mutex::new(receiver));
  13. let mut workers = Vec::with_capacity(size);
  14. for id in 0..size {
  15. workers.push(Worker::new(id, Arc::clone(&receiver)));
  16. }
  17. ThreadPool {
  18. workers,
  19. sender,
  20. }
  21. }
  22. pub fn execute<F>(&self, f: F)
  23. where F: FnOnce() + Send + 'static
  24. {
  25. let job = Box::new(f);
  26. self.sender.send(job).unwrap();
  27. }
  28. // pub fn spawn<F, T>(f: F) -> JoinHandle<T>
  29. // where
  30. // F: FnOnce() -> T + Send + 'static,
  31. // T: Send + 'static
  32. // {
  33. // }
  34. }
  35. struct Worker {
  36. id: usize,
  37. thread: thread::JoinHandle<()>,
  38. }
  39. impl Worker {
  40. fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
  41. let thread = thread::spawn(move || {
  42. loop {
  43. let job = receiver.lock().unwrap().recv().unwrap();
  44. println!("Worker {} got a job, executing.", id);
  45. job();
  46. }
  47. });
  48. Worker {
  49. id,
  50. thread,
  51. }
  52. }
  53. }