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?