From 30fd398ad6dbad252fe1bcb1716f006f8dd2d117 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 17 May 2018 16:34:22 -0600 Subject: [PATCH] pattern 1 --- Chapter08/Cargo.toml | 4 ++++ Chapter08/pattern1.rs | 41 ++++++++++++++++++++++++++++++++++++ Chapter08/pattern2.rs | 49 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 Chapter08/pattern1.rs create mode 100644 Chapter08/pattern2.rs diff --git a/Chapter08/Cargo.toml b/Chapter08/Cargo.toml index 33ee6c8..3bd7520 100644 --- a/Chapter08/Cargo.toml +++ b/Chapter08/Cargo.toml @@ -76,3 +76,7 @@ path = "share6.rs" name = "share7" path = "share7.rs" +[[bin]] +name = "pattern1" +path = "pattern1.rs" + diff --git a/Chapter08/pattern1.rs b/Chapter08/pattern1.rs new file mode 100644 index 0000000..f0c464b --- /dev/null +++ b/Chapter08/pattern1.rs @@ -0,0 +1,41 @@ +use std::thread; +use std::sync::mpsc::{channel}; +use std::time; + +fn main() { + let (pinginsend,pinginrecv) = channel(); + let (pingoutsend,pingoutrecv) = channel(); + let mut ping = 1; + thread::spawn(move || { + let t = time::Duration::from_millis(1000); + loop { + let n = pinginrecv.recv().unwrap(); + ping += n; + println!("ping {}", ping); + thread::sleep(t); + pingoutsend.send(ping).unwrap(); + } + }); + + let (ponginsend,ponginrecv) = channel(); + let (pongoutsend,pongoutrecv) = channel(); + let mut pong = 2; + thread::spawn(move || { + let t = time::Duration::from_millis(1000); + loop { + let n = ponginrecv.recv().unwrap(); + pong += n; + println!("pong {}", pong); + thread::sleep(t); + pongoutsend.send(pong).unwrap(); + } + }); + + let mut d = 3; + loop { + pinginsend.send(d).unwrap(); + d = pingoutrecv.recv().unwrap(); + ponginsend.send(d).unwrap(); + d = pongoutrecv.recv().unwrap(); + } +} diff --git a/Chapter08/pattern2.rs b/Chapter08/pattern2.rs new file mode 100644 index 0000000..94309e2 --- /dev/null +++ b/Chapter08/pattern2.rs @@ -0,0 +1,49 @@ +use std::thread; +use std::sync::mpsc::{channel}; +use std::time; + +fn new_ping() { + let (pinginsend,pinginrecv) = channel(); + let (pingoutsend,pingoutrecv) = channel(); + let mut ping = 1; + thread::spawn(move || { + let t = time::Duration::from_millis(1000); + loop { + let n = pinginrecv.recv().unwrap(); + ping += n; + println!("ping {}", ping); + thread::sleep(t); + pingoutsend.send(ping).unwrap(); + } + }); + (pinginsend, pingoutrecv) +} + +fn new_pong() { + let (ponginsend,ponginrecv) = channel(); + let (pongoutsend,pongoutrecv) = channel(); + let mut pong = 2; + thread::spawn(move || { + let t = time::Duration::from_millis(1000); + loop { + let n = ponginrecv.recv().unwrap(); + pong += n; + println!("pong {}", pong); + thread::sleep(t); + pongoutsend.send(pong).unwrap(); + } + }); + (ponginsend, pongoutrecv) +} + +fn main() { + let mut d = 3; + let pings = vec![ping_new(), ping_new(), ping_new()]; + let pongs = vec![pong_new(), pong_new(), pong_new()]; + loop { + pinginsend.send(d).unwrap(); + d = pingoutrecv.recv().unwrap(); + ponginsend.send(d).unwrap(); + d = pongoutrecv.recv().unwrap(); + } +}