use std::thread;
use std::sync::{Mutex,Arc};
struct Philosopher{
name: String,
left: usize,
right:usize,
}
fn new(name: &str, left:usize, right:usize) -> Philosopher{
Philosopher {
name:name.to_string(),
left:left,
right:right,
}
}
impl Philosopher{
fn new(name: &str) -> Philosopher{
Philosopher{
name: name.to_string(),
left:left,
right:right,
}
}
}
fn eat(&self, table: &Table){
let_left = table.forks[self.left].lock().unwrap();
let_right = table.forks[self.right].lock().unwrap();
println!("{} начал есть.",
self.name);
thread::sleep_ms(1000);
println!("{} закончил есть.",
self.name);
}
struct Table{
forks:Vec<Mutex<()>>,
}
fn main() {
let table = Arc::new(Table{forks: vec![
Mutex::new(()),
Mutex::new(()),
Mutex::new(()),
Mutex::new(()),
Mutex::new(()),
]});
let philosophers = vec![
Philosopher::new("Мартин Хайдегер", 0, 1),
Philosopher::new("Фридрих Ницше", 1, 2),
Philosopher::new("Александр Дугин", 2, 3),
Philosopher::new ("Жан-Поль Сартр", 3, 4),
Philosopher::new("Рене Декарт", 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();
}
}