Вечеря філософів

Проблема вечері філософів - це класична проблема одночасного виконання:

П'ятеро філософів вечеряють разом за одним столом. У кожного філософа своє місце за столом. Між кожною тарілкою є виделка. Страва, що подається, являє собою різновид спагетті, яке потрібно їсти двома виделками. Кожен філософ може лише поперемінно мислити і їсти. Крім того, філософ може їсти свої спагетті лише тоді, коли у нього є і ліва, і права виделка. Таким чином, дві виделки будуть доступні лише тоді, коли його найближчі сусіди думають, а не їдять. Після того, як окремий філософ закінчує їсти, він кладе обидві виделки.

Для цієї вправи вам знадобиться локальний встановленний Cargo. Скопіюйте наведений нижче код у файл під назвою src/main.rs, заповніть порожні поля та перевірте, чи cargo run не блокує:

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!("Еврика! {} має нову ідею!", &self.name))
            .unwrap();
    }

    fn eat(&self) {
        // Беремо виделки...
        println!("{} їсть...", &self.name);
        thread::sleep(Duration::from_millis(10));
    }
}

static PHILOSOPHERS: &[&str] =
    &["Сократ", "Гіпатія", "Платоне", "Аристотель", "Піфагор"];

fn main() {
    // Створюємо виделки

    // Створюємо філософів

    // Змусимо кожного з них подумати і з'їсти 100 разів

    // Вивести свої думки
}

Ви можете використовувати наступний Cargo.toml:

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