Вечеря філософів — 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.
- Чи можете ви зробити вашу реалізацію однопотоковою?