哲学家就餐问题
哲学家用餐示例是一个典型的并发问题:
五位哲学家在同一桌子上用餐。每位哲学家在桌前都有自己的座位。每个盘子之间都有一把叉子。上的菜品是一种意大利面,需要用两把叉子才能吃。每位哲学家只能交替进行思考和用餐。此外,只有当哲学家们同时拿到左边和右边的叉子才能吃这个意大利面。因此,只有当两旁坐着的人在思考,而非在吃面时,他们才能使用两把叉子。每位哲学家吃完饭后,就会放下手中的两把叉子。
在本练习中,需要使用本地 Cargo 安装。将以下代码复制到名为 src/main.rs
的文件中,并填写空白的地方,然后测试 cargo run
不会死锁:
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! {} has a new idea!", &self.name))
.unwrap();
}
fn eat(&self) {
// Pick up forks...
println!("{} is eating...", &self.name);
thread::sleep(Duration::from_millis(10));
}
}
static PHILOSOPHERS: &[&str] =
&["Socrates", "Hypatia", "Plato", "Aristotle", "Pythagoras"];
fn main() {
// Create forks
// Create philosophers
// Make each of them think and eat 100 times
// Output their thoughts
}
您可以使用以下 Cargo.toml
:
[package]
name = "dining-philosophers"
version = "0.1.0"
edition = "2021"
上一篇:62. 习题
下一篇:62.2. 多线程链接检查器