]>
git.proxmox.com Git - rustc.git/blob - src/doc/book/listings/ch20-web-server/listing-20-25/src/lib.rs
2 sync
::{mpsc, Arc, Mutex}
,
6 pub struct ThreadPool
{
8 sender
: Option
<mpsc
::Sender
<Job
>>,
11 type Job
= Box
<dyn FnOnce() + Send
+ '
static>;
14 /// Create a new ThreadPool.
16 /// The size is the number of threads in the pool.
20 /// The `new` function will panic if the size is zero.
21 pub fn new(size
: usize) -> ThreadPool
{
24 let (sender
, receiver
) = mpsc
::channel();
26 let receiver
= Arc
::new(Mutex
::new(receiver
));
28 let mut workers
= Vec
::with_capacity(size
);
31 workers
.push(Worker
::new(id
, Arc
::clone(&receiver
)));
40 pub fn execute
<F
>(&self, f
: F
)
42 F
: FnOnce() + Send
+ '
static,
44 let job
= Box
::new(f
);
46 self.sender
.as_ref().unwrap().send(job
).unwrap();
50 impl Drop
for ThreadPool
{
52 drop(self.sender
.take());
54 for worker
in &mut self.workers
{
55 println
!("Shutting down worker {}", worker
.id
);
57 if let Some(thread
) = worker
.thread
.take() {
58 thread
.join().unwrap();
66 thread
: Option
<thread
::JoinHandle
<()>>,
70 fn new(id
: usize, receiver
: Arc
<Mutex
<mpsc
::Receiver
<Job
>>>) -> Worker
{
71 let thread
= thread
::spawn(move || loop {
72 let message
= receiver
.lock().unwrap().recv();
76 println
!("Worker {id} got a job; executing.");
81 println
!("Worker {id} disconnected; shutting down.");