FilĂłsofos Jantando

O problema dos filĂłsofos jantando Ă© um problema clĂĄssico em concorrĂȘncia:

Cinco filĂłsofos jantam juntos na mesma mesa. Cada folĂłsofo tem seu prĂłprio lugar Ă  mesa. HĂĄ um garfo entre cada prato. O prato servido Ă© uma espĂ©cie de espaguete que se come com dois garfos. Cada filĂłsofo pode somente pensar ou comer, alternadamente. AlĂ©m disso, um filĂłsofo sĂł pode comer seu espaguete quando ele tĂȘm garfo esquerdo e direito. Assim, dois garfos sĂł estarĂŁo disponĂ­veis quando seus dois vizinhos mais prĂłximos estiverem pensando, nĂŁo comendo. Depois de um filĂłsofo individual termina de comer, ele abaixa os dois garfos.

You will need a local Cargo installation for this exercise. Copy the code below to a file called src/main.rs, fill out the blanks, and test that cargo run does not deadlock:

use std::sync::{mpsc, Arc, Mutex};
use std::thread;
use std::time::Duration;

struct Fork;

struct Philosopher {
    name: String,
    // left_fork: ...
    // right_fork: ...
    // thoughts: ...
}

impl Philosopher {
    fn think(&self) {
        self.thoughts
            .send(format!("Eureka! {} has a new idea!", &self.name))
            .unwrap();
    }

    fn eat(&self) {
        // Pick up forks...
        println!("{} is eating...", &self.name);
        thread::sleep(Duration::from_millis(10));
    }
}

static PHILOSOPHERS: &[&str] =
    &["Socrates", "Plato", "Aristotle", "Thales", "Pythagoras"];

fn main() {
    // Create forks

    // Create philosophers

    // Make each of them think and eat 100 times

    // Output their thoughts
}

You can use the following Cargo.toml:

[package]
name = "dining-philosophers"
version = "0.1.0"
edition = "2021"