Guest User

Untitled

a guest
May 25th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.79 KB | None | 0 0
  1. use std::thread;
  2. use std::time::Duration;
  3. use std::sync::{Mutex, Arc};
  4.  
  5. struct Table {
  6. forks: Vec<Mutex<()>>,
  7. }
  8.  
  9.  
  10. enum Gender {
  11. Male,
  12. Female,
  13. }
  14.  
  15. struct Philosopher {
  16. name: String,
  17. gender: Gender,
  18. hand_left: usize,
  19. hand_right: usize,
  20. }
  21.  
  22. impl Philosopher {
  23. fn new(name: &str, gender: Gender, left: usize, right: usize) -> Philosopher {
  24. Philosopher {
  25. name: name.to_string(),
  26. gender: gender,
  27. hand_left: left,
  28. hand_right: right,
  29. }
  30. }
  31.  
  32. fn eat_start (&self) {
  33. match self.gender {
  34. Gender::Male => println!("{} начал есть.", self.name),
  35. Gender::Female => println!("{} начала есть.", self.name),
  36. };
  37. }
  38.  
  39. fn eat_end (&self) {
  40. match self.gender {
  41. Gender::Male => println!("{} закончил есть.", self.name),
  42. Gender::Female => println!("{} закончила есть.", self.name),
  43. };
  44. }
  45.  
  46. fn eat_from(&self, table: &Table) {
  47.  
  48. loop {
  49. println!("{} думает.", self.name);
  50.  
  51. thread::sleep(Duration::from_millis(1000));
  52.  
  53. let _left = match table.forks[self.hand_left].try_lock() {
  54. Ok(res) => res,
  55. Err(_) => continue,
  56. };
  57.  
  58. let _right = match table.forks[self.hand_right].try_lock() {
  59. Ok(res) => res,
  60. Err(_) => continue,
  61. };
  62.  
  63. self.eat_start();
  64. self.eat_end();
  65.  
  66. break;
  67. }
  68. }
  69. }
  70.  
  71. fn main() {
  72. let table = Arc::new(Table { forks: vec![
  73. Mutex::new(()),
  74. Mutex::new(()),
  75. Mutex::new(()),
  76. Mutex::new(()),
  77. Mutex::new(()),
  78. ]});
  79.  
  80.  
  81. let philosophers = vec![
  82. Philosopher::new("Джудит Батлер", Gender::Female, 0, 1),
  83. Philosopher::new("Рая Дунаевская", Gender::Female, 1, 2),
  84. Philosopher::new("Аристотель", Gender::Male, 2, 3),
  85. Philosopher::new("Эмма Гольдман", Gender::Female, 3, 4),
  86. Philosopher::new("Сократ", Gender::Male, 4, 0),
  87. ];
  88.  
  89. // let mut handles: Vec<_> = vec![];
  90.  
  91. // for philosopher in philosophers {
  92. // let table = table.clone();
  93. // handles.push(thread::spawn(move || {
  94. // philosopher.eat_from(&table);
  95. // }))
  96. // }
  97.  
  98. let handles: Vec<_> = philosophers.into_iter().map(|p| {
  99. let table = table.clone();
  100. thread::spawn(move || {
  101. p.eat_from(&table);
  102. })
  103. }).collect();
  104.  
  105. let mut index = 0;
  106.  
  107. for h in handles {
  108. index += 1;
  109. match h.join() {
  110. Ok(_) => println!("Поток #{} завершен", index.to_string()),
  111. Err(_) => println!("поперхнулся"),
  112. };
  113. }
  114. }
Add Comment
Please, Sign In to add comment