Guest User

Untitled

a guest
Nov 20th, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.85 KB | None | 0 0
  1. use std::sync::{Arc, Mutex};
  2. use std::thread;
  3. use std::time::Duration;
  4.  
  5. struct Philosopher {
  6. name: String,
  7. left_fork: usize,
  8. right_fork: usize,
  9. }
  10.  
  11. impl Philosopher {
  12. fn new(name: &str, left_fork: usize, right_fork: usize) -> Philosopher {
  13. Philosopher {
  14. name: name.to_string(),
  15. left_fork: left_fork,
  16. right_fork: right_fork,
  17. }
  18. }
  19.  
  20. fn eat(&self, table: &Table) {
  21. let _left = table.forks[self.left_fork].lock().unwrap();
  22. println!("{} взял(а) первую вилку.", self.name);
  23. thread::sleep(Duration::from_millis(1000));
  24. let _right = table.forks[self.right_fork].lock().unwrap();
  25. println!("{} взял(а) вторую вилку.", self.name);
  26.  
  27. println!("{} начал(а) есть.", self.name);
  28. thread::sleep(Duration::from_millis(5000));
  29. println!(
  30. "{} закончил(а) есть и положил(а) обе вилки.",
  31. self.name
  32. );
  33. }
  34. }
  35.  
  36. struct Table {
  37. forks: Vec<Mutex<()>>,
  38. }
  39.  
  40. impl Table {
  41. fn new(places: usize) -> Table {
  42. let mut forks = Vec::new();
  43. for _ in 0..places {
  44. forks.push(Mutex::new(()));
  45. }
  46. Table { forks: forks }
  47. }
  48. }
  49.  
  50. fn main() {
  51. let philosophers = vec![
  52. ("Андрей", 0, 1),
  53. ("Артем", 1, 2),
  54. ("Наташа", 0, 2),
  55. ];
  56.  
  57. let philosophers: Vec<_> = philosophers
  58. .into_iter()
  59. .map(|p| Philosopher::new(p.0, p.1, p.2))
  60. .collect();
  61.  
  62. let table = Arc::new(Table::new(philosophers.len()));
  63.  
  64. let handles: Vec<_> = philosophers
  65. .into_iter()
  66. .map(|p| {
  67. let table = table.clone();
  68.  
  69. thread::spawn(move || {
  70. p.eat(&table);
  71. })
  72. }).collect();
  73.  
  74. for h in handles {
  75. h.join().unwrap();
  76. }
  77. }
Add Comment
Please, Sign In to add comment