Вечеря філософів
Проблема вечері філософів - це класична проблема одночасного виконання:
П'ятеро філософів вечеряють разом за одним столом. У кожного філософа своє місце за столом. Між кожною тарілкою є виделка. Страва, що подається, являє собою різновид спагетті, яке потрібно їсти двома виделками. Кожен філософ може лише поперемінно мислити і їсти. Крім того, філософ може їсти свої спагетті лише тоді, коли у нього є і ліва, і права виделка. Таким чином, дві виделки будуть доступні лише тоді, коли його найближчі сусіди думають, а не їдять. Після того, як окремий філософ закінчує їсти, він кладе обидві виделки.
Для цієї вправи вам знадобиться локальний встановленний 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!("Еврика! {} має нову ідею!", &self.name)) .unwrap(); } fn eat(&self) { // Беремо виделки... println!("{} їсть...", &self.name); thread::sleep(Duration::from_millis(10)); } } static PHILOSOPHERS: &[&str] = &["Сократ", "Гіпатія", "Платоне", "Аристотель", "Піфагор"]; fn main() { // Створюємо виделки // Створюємо філософів // Змусимо кожного з них подумати і з'їсти 100 разів // Вивести свої думки }
Ви можете використовувати наступний Cargo.toml
:
[package]
name = "dining-philosophers"
version = "0.1.0"
edition = "2021"