食事する哲学者

食事する哲学者問題は、並行性における古典的な問題です:

5 人の哲学者が同じテーブルで一緒に食事をします。各哲学者には テーブルの自分の席があります。各皿の間には 1 本の箸があります。出される料理は スパゲッティで、食べるには 2 本の箸が必要です。各哲学者は 考えることと食べることを交互に行うことしかできません。さらに、哲学者が スパゲッティを食べられるのは、左と右の箸の両方を持っているときだけです。したがって 2 本の箸が 使えるのは、左右の隣人 2 人が食べておらず、考えているときだけです。 それぞれの哲学者は食べ終えたら、 両方の箸を置きます。

この演習を行うには、ローカルに Cargo をインストール しておく必要があります。 以下のコードを src/main.rs というファイルにコピーし、空欄を埋めて、 cargo run がデッドロックしないことを確認してください:

// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

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

struct Chopstick;

struct Philosopher {
    name: String,
    // left_chopstick: ...
    // right_chopstick: ...
    // thoughts: ...
}

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

    fn eat(&self) {
        // 箸を取る...
        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 = "2024"
  • まずは「ほぼ」動作する解決策の実装に集中するよう、学生に促してください。
  • 最も単純な解決策におけるデッドロックは、一般的な並行性の問題であり、 Rust がこの種のバグを自動的に防いでくれるわけではないことを示しています。