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"