@@ -5,7 +5,7 @@ use std::{
5
5
6
6
pub struct ThreadPool {
7
7
workers : Vec < Worker > ,
8
- sender : mpsc:: Sender < Job > ,
8
+ sender : Option < mpsc:: Sender < Job > > ,
9
9
}
10
10
11
11
impl ThreadPool {
@@ -17,14 +17,27 @@ impl ThreadPool {
17
17
for id in 0 ..size {
18
18
workers. push ( Worker :: new ( id, Arc :: clone ( & receiver) ) ) ;
19
19
}
20
- ThreadPool { workers, sender }
20
+ ThreadPool {
21
+ workers,
22
+ sender : Some ( sender) ,
23
+ }
21
24
}
22
25
pub fn execute < F > ( & self , f : F )
23
26
where
24
27
F : FnOnce ( ) + Send + ' static ,
25
28
{
26
29
let job = Box :: new ( f) ;
27
- self . sender . send ( job) . unwrap ( ) ;
30
+ self . sender . as_ref ( ) . unwrap ( ) . send ( job) . unwrap ( ) ;
31
+ }
32
+ }
33
+
34
+ impl Drop for ThreadPool {
35
+ fn drop ( & mut self ) {
36
+ drop ( self . sender . take ( ) ) ;
37
+ for worker in & mut self . workers . drain ( ..) {
38
+ println ! ( "Shutting down the worker {}" , worker. id) ;
39
+ worker. thread . join ( ) . unwrap ( ) ;
40
+ }
28
41
}
29
42
}
30
43
@@ -37,9 +50,17 @@ impl Worker {
37
50
fn new ( id : usize , receiver : Arc < Mutex < mpsc:: Receiver < Job > > > ) -> Worker {
38
51
let thread = thread:: spawn ( move || {
39
52
loop {
40
- let job = receiver. lock ( ) . unwrap ( ) . recv ( ) . unwrap ( ) ;
41
- println ! ( "Worker {id} got a job! Executing!" ) ;
42
- job ( ) ;
53
+ let msg = receiver. lock ( ) . unwrap ( ) . recv ( ) ;
54
+ match msg {
55
+ Ok ( job) => {
56
+ println ! ( "Worker {id} got a job! Executing!" ) ;
57
+ job ( ) ;
58
+ }
59
+ Err ( _) => {
60
+ println ! ( "Worker {id} disconnected! Shutting down!" ) ;
61
+ break ;
62
+ }
63
+ } ;
43
64
}
44
65
} ) ;
45
66
Worker { id, thread }
0 commit comments