Jantar dos FilĂłsofos
O problema do jantar dos filĂłsofos Ă© 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.
VocĂȘ precisarĂĄ de uma instalação local do Cargo para esse exercĂcio. Copie o cĂłdigo abaixo para um arquivo chamado src/main.rs
, preencha os espaços em branco e teste se cargo run
nĂŁo entra em 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! {} tem uma nova ideia!", &self.name)) .unwrap(); } fn eat(&self) { // Peguem os garfos... println!("{} estå comendo...", &self.name); thread::sleep(Duration::from_millis(10)); } } static PHILOSOPHERS: &[&str] = &["Sócrates", "Hipåtia", "Platão", "Aristóteles", "Pitågoras"]; fn main() { // Criem os garfos // Criem os filósofos // Façam cada um deles pensar e comer 100 vezes // Imprimam seus pensamentos }
VocĂȘ pode usar o seguinte Cargo.toml
[package]
name = "dining-philosophers"
version = "0.1.0"
edition = "2021"