Rust 2 Dining Philosopher Problem

use std::thread;
use std::sync::{Mutex, Arc};

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 _left = table.forks[self.left].lock().unwrap();
        let _right = table.forks[self.right].lock().unwrap();

        println!("{} is eating.", self.name);
        thread::sleep_ms(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", 4, 0),
    ];


    let handlers: Vec<_> = philosophers.into_iter().map(|p| {
        let table = table.clone();
        thread::spawn(move || {
            p.eat(&table);
        })

    }).collect();

    for h in handlers {
        h.join().unwrap();
    }



}

你可能感兴趣的:(Rust 2 Dining Philosopher Problem)