哲学家就餐问题

哲学家用餐示例是一个典型的并发问题:

五位哲学家在同一桌子上用餐。每位哲学家在桌前都有自己的座位。每个盘子之间都有一把叉子。上的菜品是一种意大利面,需要用两把叉子才能吃。每位哲学家只能交替进行思考和用餐。此外,只有当哲学家们同时拿到左边和右边的叉子才能吃这个意大利面。因此,只有当两旁坐着的人在思考,而非在吃面时,他们才能使用两把叉子。每位哲学家吃完饭后,就会放下手中的两把叉子。

在本练习中,需要使用本地 Cargo 安装。将以下代码复制到名为 src/main.rs 的文件中,并填写空白的地方,然后测试 cargo run 不会死锁:

  1. use std::sync::{mpsc, Arc, Mutex};
  2. use std::thread;
  3. use std::time::Duration;
  4. struct Fork;
  5. struct Philosopher {
  6. name: String,
  7. // left_fork: ...
  8. // right_fork: ...
  9. // thoughts: ...
  10. }
  11. impl Philosopher {
  12. fn think(&self) {
  13. self.thoughts
  14. .send(format!("Eureka! {} has a new idea!", &self.name))
  15. .unwrap();
  16. }
  17. fn eat(&self) {
  18. // Pick up forks...
  19. println!("{} is eating...", &self.name);
  20. thread::sleep(Duration::from_millis(10));
  21. }
  22. }
  23. static PHILOSOPHERS: &[&str] =
  24. &["Socrates", "Hypatia", "Plato", "Aristotle", "Pythagoras"];
  25. fn main() {
  26. // Create forks
  27. // Create philosophers
  28. // Make each of them think and eat 100 times
  29. // Output their thoughts
  30. }

您可以使用以下 Cargo.toml

  1. [package]
  2. name = "dining-philosophers"
  3. version = "0.1.0"
  4. edition = "2021"