食事する哲学者

食事する哲学者の問題は、並行性に関する古典的な問題です。

5 人の哲学者が同じテーブルで食事をしています。それぞれの哲学者がテーブルの定位置に座り、皿の間にはフォークが 1 本置かれています。提供される料理はスパゲッティで、2 本のフォークで食べる必要があります。哲学者は思索と食事を交互に繰り返すことしかできません。さらに、哲学者は左右両方のフォークを持っている場合にのみ、スパゲッティを食べることができます。したがって、2 つのフォークは、両隣の哲学者が食べるのではなく考えている場合にのみ使用できます。それぞれの哲学者は、食べ終わった後、両方のフォークを置きます。

この演習では、ローカルの 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!("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", "Hypatia", "Plato", "Aristotle", "Pythagoras"];

fn main() {
    // フォークを作成する

    // 哲学者を作成する

    // それぞれの哲学者が思索と食事を 100 回行うようにする

    // 哲学者の思索を出力する
}

次の Cargo.toml を使用できます。

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