Вечеря філософів
Проблема вечері філософів - це класична проблема одночасного виконання:
П’ятеро філософів вечеряють разом за одним столом. У кожного філософа своє місце за столом. Між кожною тарілкою є виделка. Страва, що подається, являє собою різновид спагетті, яке потрібно їсти двома виделками. Кожен філософ може лише поперемінно мислити і їсти. Крім того, філософ може їсти свої спагетті лише тоді, коли у нього є і ліва, і права виделка. Таким чином, дві виделки будуть доступні лише тоді, коли його найближчі сусіди думають, а не їдять. Після того, як окремий філософ закінчує їсти, він кладе обидві виделки.
Для цієї вправи вам знадобиться локальний встановленний 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"