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) {
// Continue tentando até termos ambos os garfos
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
.
Speaker Notes
This slide should take about 20 minutes.
- Você pode fazer sua implementação single-threaded?