Jantar dos FilĂłsofos â Async
Veja Jantar dos Filósofos para uma descrição do problema.
Como antes, vocĂȘ precisarĂĄ de uma instalação local do Cargo para este 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 trava:
use std::sync::Arc; use tokio::sync::mpsc::{self, Sender}; use tokio::sync::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!("Eureka! {} tem uma nova ideia!", &self.name)) .await .unwrap(); } async fn eat(&self) { // Keep trying until we have both forks println!("{} estå comendo...", &self.name); time::sleep(time::Duration::from_millis(5)).await; } } static PHILOSOPHERS: &[&str] = &["Sócrates", "Hipåtia", "Platão", "Aristóteles", "Pitågoras"]; #[tokio::main] async fn main() { // Criem os garfos // Criem os filósofos // Faça-os pensar e comer // Imprimam seus pensamentos }
Como desta vez vocĂȘ estĂĄ usando Rust Async, vocĂȘ precisarĂĄ de uma dependĂȘncia tokio
. VocĂȘ pode usar o seguinte 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"] }
TambĂ©m observe que desta vez vocĂȘ tem que usar o mĂłdulo Mutex
e o mĂłdulo mpsc
do crate tokio
.
- VocĂȘ pode fazer sua implementação single-threaded?