Jantar dos FilĂłsofos

O problema do jantar dos filĂłsofos Ă© 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.

VocĂȘ precisarĂĄ de uma instalação local do Cargo para esse exercĂ­cio. Copie o cĂłdigo abaixo para um arquivo chamado src/main.rs, preencha os espaços em branco e teste se cargo run nĂŁo entra em 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! {} tem uma nova ideia!", &self.name))
            .unwrap();
    }

    fn eat(&self) {
        // Peguem os garfos...
        println!("{} estĂĄ comendo...", &self.name);
        thread::sleep(Duration::from_millis(10));
    }
}

static PHILOSOPHERS: &[&str] =
    &["SĂłcrates", "HipĂĄtia", "PlatĂŁo", "AristĂłteles", "PitĂĄgoras"];

fn main() {
    // Criem os garfos

    // Criem os filĂłsofos

    // Façam cada um deles pensar e comer 100 vezes

    // Imprimam seus pensamentos
}

VocĂȘ pode usar o seguinte Cargo.toml

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