From b56f5b1c25f81c4f73866a3297b7e39792c617ab Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Wed, 16 May 2018 15:16:15 -0600 Subject: [PATCH] thread 4 --- Chapter08/Cargo.toml | 4 ++++ Chapter08/thread4.rs | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 Chapter08/thread4.rs diff --git a/Chapter08/Cargo.toml b/Chapter08/Cargo.toml index 0143bfc..d9329cc 100644 --- a/Chapter08/Cargo.toml +++ b/Chapter08/Cargo.toml @@ -37,3 +37,7 @@ path = "thread2.rs" [[bin]] name = "thread3" path = "thread3.rs" + +[[bin]] +name = "thread4" +path = "thread4.rs" diff --git a/Chapter08/thread4.rs b/Chapter08/thread4.rs new file mode 100644 index 0000000..abdbee6 --- /dev/null +++ b/Chapter08/thread4.rs @@ -0,0 +1,38 @@ +use std::{thread,time}; +use std::process; +use std::io::prelude::*; +extern crate thread_id; +use std::net::{TcpListener,TcpStream}; +use std::sync::mpsc::{channel,Receiver}; +use std::collections::VecDeque; + +fn serve(receiver: Receiver) { + let t = time::Duration::from_millis(10); + loop { + let mut tcp = receiver.recv().unwrap(); + let mut buffer = [0; 2048]; + tcp.read(&mut buffer).expect("tcp read failed"); + let response = format!("respond from #{}:{}\n", process::id(), thread_id::get()); + tcp.write(response.as_bytes()).expect("tcp write failed"); + thread::sleep(t); + } +} + +fn main() { + let listener = TcpListener::bind("127.0.0.1:8888").unwrap(); + let mut channels = VecDeque::new(); + + for _ in 0..3 { + let (sender, receiver) = channel(); + channels.push_back(sender); + thread::spawn(move || { + serve(receiver); + }); + } + + for stream in listener.incoming() { + let round_robin = channels.pop_front().unwrap(); + round_robin.send(stream.unwrap()).unwrap(); + channels.push_back(round_robin); + } +}