thread3.rs
parent
43a670c9ce
commit
f69cf533f6
@ -1,36 +1,42 @@
|
|||||||
extern crate nix;
|
|
||||||
use nix::unistd::{fork,ForkResult};
|
|
||||||
use std::{thread,time};
|
use std::{thread,time};
|
||||||
use std::process;
|
use std::process;
|
||||||
|
extern crate thread_id;
|
||||||
use std::io::prelude::*;
|
use std::io::prelude::*;
|
||||||
use std::net::TcpListener;
|
use std::net::{TcpListener,TcpStream};
|
||||||
|
use std::sync::{Arc,Mutex};
|
||||||
|
|
||||||
fn serve(listener: TcpListener) -> ! {
|
fn serve(incoming: Arc<Mutex<Vec<TcpStream>>>) {
|
||||||
for stream in listener.incoming() {
|
let t = time::Duration::from_millis(10);
|
||||||
let mut buffer = [0; 2048];
|
loop {
|
||||||
let mut tcp = stream.unwrap();
|
{
|
||||||
tcp.read(&mut buffer).expect("tcp read failed");
|
let mut incoming = incoming.lock().unwrap();
|
||||||
let response = format!("respond from #{}\n", process::id());
|
for stream in incoming.iter() {
|
||||||
tcp.write(response.as_bytes()).expect("tcp write failed");
|
let mut buffer = [0; 2048];
|
||||||
|
let mut tcp = stream;
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
incoming.clear();
|
||||||
|
}
|
||||||
|
thread::sleep(t);
|
||||||
}
|
}
|
||||||
panic!("unreachable");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let listener = TcpListener::bind("127.0.0.1:8888").unwrap();
|
let listener = TcpListener::bind("127.0.0.1:8888").unwrap();
|
||||||
let mut children = Vec::new();
|
let incoming = Vec::new();
|
||||||
|
let incoming = Arc::new(Mutex::new(incoming));
|
||||||
|
|
||||||
for _ in 0..3 {
|
for _ in 0..3 {
|
||||||
match fork().expect("fork failed") {
|
let incoming = Arc::clone(&incoming);
|
||||||
ForkResult::Parent{ child: pid } => { children.push(pid); }
|
thread::spawn(move || {
|
||||||
ForkResult::Child => {
|
serve(incoming);
|
||||||
serve(listener)
|
});
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let t = time::Duration::from_millis(1000);
|
for stream in listener.incoming() {
|
||||||
loop {
|
let mut incoming = incoming.lock().unwrap();
|
||||||
thread::sleep(t);
|
(*incoming).push(stream.unwrap());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue