Dining Philosophers — Async

See dining philosophers for a description of the problem.

前と同様に、この演習でもローカルの Cargo インストール が必要です。以下のコードを src/main.rs というファイルにコピーし、空欄を埋めて、cargo run がデッドロックしないことを確認します。

use std::sync::Arc; use tokio::sync::{mpsc, Mutex}; use tokio::time; struct Fork; struct Philosopher { name: String, // left_fork: ... // right_fork: ... // thoughts: ... } impl Philosopher { async fn think(&self) { self.thoughts .send(format!("Eureka! {} has a new idea!", &self.name)) .await .unwrap(); } async fn eat(&self) { // Keep trying until we have both forks println!("{} is eating...", &self.name); time::sleep(time::Duration::from_millis(5)).await; } } static PHILOSOPHERS: &[&str] = &["Socrates", "Hypatia", "Plato", "Aristotle", "Pythagoras"]; #[tokio::main] async fn main() { // フォークを作成する // 哲学者を作成する // 哲学者が思索と食事を行うようにする // 哲学者の思索を出力する }

今回は非同期 Rust を使用するため、tokio 依存関係が必要になります。次の Cargo.toml を使用できます。

[package] name = "dining-philosophers-async-dine" version = "0.1.0" edition = "2021" [dependencies] tokio = { version = "1.26.0", features = ["sync", "time", "macros", "rt-multi-thread"] }

また、今度は tokio クレートの Mutex モジュールと mpsc モジュールを使用する必要があることにも注意してください。

Speaker Notes

This slide should take about 20 minutes.
  • 実装をシングルスレッドにできますか?