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

Перегляньте вечерю філософів для опису проблеми.

Як і раніше, для виконання цієї вправи вам знадобиться локальний встановленний 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!("Еврика! {} має нову ідею!", &self.name)) .await .unwrap(); } async fn eat(&self) { // Продовжуємо пробувати, поки не знайдемо обидві виделки println!("{} їсть...", &self.name); time::sleep(time::Duration::from_millis(5)).await; } } static PHILOSOPHERS: &[&str] = &["Сократ", "Гіпатія", "Платоне", "Аристотель", "Піфагор"]; #[tokio::main] async fn main() { // Створюємо виделки // Створюємо філософів // Змусимо їх думати і їсти // Вивести свої думки }

Оскільки цього разу ви використовуєте Async 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"] }

Також зауважте, що цього разу вам доведеться використовувати Mutex і модуль mpsc з крейту tokio.

Speaker Notes

This slide should take about 20 minutes.
  • Чи можете ви зробити вашу реалізацію однопотоковою?