summaryrefslogtreecommitdiffstats
path: root/src/doc/book/listings/ch20-web-server/listing-20-18/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/doc/book/listings/ch20-web-server/listing-20-18/src/lib.rs')
-rw-r--r--src/doc/book/listings/ch20-web-server/listing-20-18/src/lib.rs76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/doc/book/listings/ch20-web-server/listing-20-18/src/lib.rs b/src/doc/book/listings/ch20-web-server/listing-20-18/src/lib.rs
new file mode 100644
index 000000000..4bff8acad
--- /dev/null
+++ b/src/doc/book/listings/ch20-web-server/listing-20-18/src/lib.rs
@@ -0,0 +1,76 @@
+// ANCHOR: here
+use std::{
+ sync::{mpsc, Arc, Mutex},
+ thread,
+};
+// --snip--
+
+// ANCHOR_END: here
+pub struct ThreadPool {
+ workers: Vec<Worker>,
+ sender: mpsc::Sender<Job>,
+}
+
+struct Job;
+
+// ANCHOR: here
+impl ThreadPool {
+ // --snip--
+ // ANCHOR_END: here
+ /// Create a new ThreadPool.
+ ///
+ /// The size is the number of threads in the pool.
+ ///
+ /// # Panics
+ ///
+ /// The `new` function will panic if the size is zero.
+ // ANCHOR: here
+ 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, Arc::clone(&receiver)));
+ }
+
+ ThreadPool { workers, sender }
+ }
+
+ // --snip--
+ // ANCHOR_END: here
+
+ pub fn execute<F>(&self, f: F)
+ where
+ F: FnOnce() + Send + 'static,
+ {
+ }
+ // ANCHOR: here
+}
+
+// --snip--
+
+// ANCHOR_END: here
+struct Worker {
+ id: usize,
+ thread: thread::JoinHandle<()>,
+}
+
+// ANCHOR: here
+impl Worker {
+ fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
+ // --snip--
+ // ANCHOR_END: here
+ let thread = thread::spawn(|| {
+ receiver;
+ });
+
+ Worker { id, thread }
+ // ANCHOR: here
+ }
+}
+// ANCHOR_END: here