Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Обедающие философы — асинхронная версия

Описание задачи см. в обедающих философах.

Как и раньше, для этого упражнения понадобится локальная установка Cargo. Скопируйте приведённый ниже код в файл src/main.rs, заполните пропуски и проверьте, что cargo run не приводит к взаимной блокировке:

// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

use std::sync::Arc;
use tokio::sync::{Mutex, mpsc};
use tokio::time;

struct Chopstick;

struct Philosopher {
    name: String,
    // left_chopstick: ...
    // right_chopstick: ...
    // thoughts: ...
}

impl Philosopher {
    async fn think(&self) {
        self.thoughts
            .send(format!("Eureka! {} has a new idea!", &self.name))
            .await
            .unwrap();
    }

    async fn eat(&self) {
        // Продолжаем пытаться, пока не получим обе палочки
        println!("{} is eating...", &self.name);
        time::sleep(time::Duration::from_millis(5)).await;
    }
}

// Планировщик tokio не приводит к взаимной блокировке с 5 философами, поэтому возьмём 2.
static PHILOSOPHERS: &[&str] = &["Socrates", "Hypatia"];

#[tokio::main]
async fn main() {
    // Создаём палочки

    // Создаём философов

    // Пусть они думают и едят

    // Выводим их мысли
}

Так как на этот раз вы используете асинхронный Rust, понадобится зависимость tokio. Можно использовать следующий Cargo.toml:

[package]
name = "dining-philosophers-async-dine"
version = "0.1.0"
edition = "2024"

[dependencies]
tokio = { version = "1.26.0", features = ["sync", "time", "macros", "rt-multi-thread"] }

Обратите также внимание, что на этот раз нужно использовать Mutex и модуль mpsc из крейта tokio.

This slide should take about 20 minutes.
  • Можете ли вы сделать вашу реализацию однопоточной?