FilĂłsofos Jantando
O problema dos filĂłsofos jantando Ă© um problema clĂĄssico em concorrĂȘncia:
Cinco filĂłsofos jantam juntos na mesma mesa. Cada folĂłsofo tem seu prĂłprio lugar Ă mesa. HĂĄ um garfo entre cada prato. O prato servido Ă© uma espĂ©cie de espaguete que se come com dois garfos. Cada filĂłsofo pode somente pensar ou comer, alternadamente. AlĂ©m disso, um filĂłsofo sĂł pode comer seu espaguete quando ele tĂȘm garfo esquerdo e direito. Assim, dois garfos sĂł estarĂŁo disponĂveis quando seus dois vizinhos mais prĂłximos estiverem pensando, nĂŁo comendo. Depois de um filĂłsofo individual termina de comer, ele abaixa os dois garfos.
You will need a local Cargo installation for this exercise. Copy the code below to a file called src/main.rs
, fill out the blanks, and test that cargo run
does not deadlock:
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!("Eureka! {} has a new idea!", &self.name)) .unwrap(); } fn eat(&self) { // Pick up forks... println!("{} is eating...", &self.name); thread::sleep(Duration::from_millis(10)); } } static PHILOSOPHERS: &[&str] = &["Socrates", "Plato", "Aristotle", "Thales", "Pythagoras"]; fn main() { // Create forks // Create philosophers // Make each of them think and eat 100 times // Output their thoughts }
You can use the following Cargo.toml
:
[package]
name = "dining-philosophers"
version = "0.1.0"
edition = "2021"