Created
February 11, 2016 15:11
-
-
Save Nnwww/3fd63c24805e2eb3856d to your computer and use it in GitHub Desktop.
フォークの奪い合いの様子を可視化
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Dining Philosophers | |
use std::thread; | |
use std::time::Duration; | |
use std::sync::{Arc, Mutex}; | |
struct Table { | |
forks: Vec<Mutex<()>>, | |
} | |
struct Philosopher { | |
name: String, | |
left: usize, | |
right: usize, | |
} | |
impl Philosopher { | |
fn new(name: &str, left: usize, right: usize) -> Philosopher { | |
Philosopher { | |
name: name.to_string(), | |
left: left, | |
right: right, | |
} | |
} | |
fn eat(&self, table: &Table) { | |
let l = table.forks[self.left].lock().unwrap(); | |
println!("Fork {} is in the left hand of {}.", self.left, self.name); | |
thread::sleep(Duration::from_millis(150)); | |
let r = table.forks[self.right].lock().unwrap(); | |
println!("Fork {} is in the right hand of {}.", self.right, self.name); | |
println!("{} is eating.", self.name); | |
thread::sleep(Duration::from_millis(1000)); | |
println!("{} is done eating.", self.name); | |
} | |
} | |
fn main() { | |
let table = Arc::new(Table { forks: vec![ | |
Mutex::new(()), | |
Mutex::new(()), | |
Mutex::new(()), | |
Mutex::new(()), | |
Mutex::new(()), | |
]}); | |
let philosophers = vec![ | |
Philosopher::new("Judith Butler", 0, 1), | |
Philosopher::new("Gilles Deleuze", 1, 2), | |
Philosopher::new("Karl Marx", 2, 3), | |
Philosopher::new("Emma Goldman", 3, 4), | |
Philosopher::new("Michel Foucault", 0, 4), | |
]; | |
let handles: Vec<_> = philosophers.into_iter().map(|p| { | |
let table = table.clone(); | |
thread::spawn(move || { | |
p.eat(&table); | |
}) | |
}).collect(); | |
for h in handles { | |
h.join().unwrap(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Output