Advertisement
Guest User

Untitled

a guest
Dec 5th, 2016
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.35 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6.  
  7. namespace PPlab2GirlsTeam
  8. {
  9. class Program
  10. {
  11. public static Semaphore s = new Semaphore(3, 3);
  12. //Вилки
  13. static List<Fork> fork = new List<Fork>();
  14. //Философы
  15. static List<Philosopher> ph = new List<Philosopher>();
  16.  
  17. static void Main(string[] args)
  18. {
  19. for (int i = 0; i < 5; i++)
  20. fork.Add(new Fork());
  21. for (int i = 0; i < 5; i++)
  22. ph.Add(new Philosopher((i).ToString(), i));
  23.  
  24. Thread t1 = new Thread(ph[0].Start);
  25. Thread t2 = new Thread(ph[1].Start);
  26. Thread t3 = new Thread(ph[2].Start);
  27. Thread t4 = new Thread(ph[3].Start);
  28. Thread t5 = new Thread(ph[4].Start);
  29.  
  30. t1.Start(fork);
  31. t2.Start(fork);
  32. t3.Start(fork);
  33. t4.Start(fork);
  34. t5.Start(fork);
  35. }
  36. }
  37.  
  38. public class Philosopher
  39. {
  40. bool isHunger = false;
  41. string philosopherName;
  42. int number;
  43. //Философ взял одну вилку и ждет ее освобождения
  44. bool isWaitingFirstFork = false;
  45. bool isWaitingSecondFork = false;
  46.  
  47. bool isDeath = false;
  48. public Philosopher(string Name, int number)
  49. {
  50. philosopherName = Name;
  51. this.number = number;
  52. }
  53.  
  54. void GetFork(List<Fork> fork)
  55. {
  56.  
  57.  
  58. Console.WriteLine("Философ {0} ждет вилки.", philosopherName);
  59. Program.s.WaitOne();
  60. int first = number;
  61. int second = 10;
  62. switch (first)
  63. {
  64. case 0: second = 1; break;
  65. case 1: second = 2; break;
  66. case 2: second = 3; break;
  67. case 3: second = 4; break;
  68. case 4: second = 0; break;
  69. }
  70. //int second = (number + 1) % (fork.Count - 1);
  71.  
  72. //Если философ голодный и у него есть Left вилка, то он ждет другую вилку Right
  73. if(isHunger && isWaitingFirstFork && !fork[second].IsUsing)
  74. {
  75.  
  76. fork[second].IsUsing = true;
  77. Console.WriteLine("Философ {0} кушает.", philosopherName);
  78. Console.WriteLine("Вилки с номерами {0} и {1} заняты.", first, second);
  79. Thread.Sleep(1000);
  80. fork[first].IsUsing = false;
  81. fork[second].IsUsing = false;
  82. isWaitingFirstFork = false;
  83. isHunger = false;
  84. }
  85.  
  86. //Если философ голодный и у него есть Second вилка, то он ждет другую вилку First
  87. if (isHunger && isWaitingSecondFork && !fork[first].IsUsing)
  88. {
  89.  
  90. fork[first].IsUsing = true;
  91. Console.WriteLine("Философ {0} кушает.", philosopherName);
  92. Console.WriteLine("Вилки с номерами {0} и {1} заняты.", first, second);
  93. Thread.Sleep(1000);
  94. fork[first].IsUsing = false;
  95. fork[second].IsUsing = false;
  96. isWaitingFirstFork = false;
  97. isHunger = false;
  98. }
  99.  
  100. //Если философ не ждет вилки и необходимые вилки свободоны
  101. if(isHunger && !isWaitingSecondFork && !isWaitingFirstFork && !fork[first].IsUsing && !fork[second].IsUsing)
  102. {
  103.  
  104. //Если вилки свободны ко кушаем
  105. fork[first].IsUsing = true;
  106. fork[second].IsUsing = true;
  107. Console.WriteLine("Философ {0} кушает.", philosopherName);
  108. Console.WriteLine("Вилки с номерами {0} и {1} заняты.", first, second);
  109. Thread.Sleep(1000);
  110. fork[first].IsUsing = false;
  111. fork[second].IsUsing = false;
  112. isHunger = false;
  113. }
  114.  
  115. //Если не ждет вилок, но только одна свободна, то занимаем ее
  116. if (isHunger && !isWaitingSecondFork && !isWaitingFirstFork && !fork[first].IsUsing && fork[second].IsUsing && number == 1)
  117. {
  118. //Если вилки свободны ко кушаем
  119. fork[first].IsUsing = true;
  120. Console.WriteLine("Философ оставил себе вилку {0}. И ждет освобождение второй вилки", first);
  121. isWaitingSecondFork = true;
  122. }
  123.  
  124. //Если не ждет вилок, но только одна свободна, то занимаем ее
  125. if (isHunger && !isWaitingSecondFork && !isWaitingFirstFork && !fork[second].IsUsing && fork[first].IsUsing && number != 1)
  126. {
  127. //Если вилки свободны ко кушаем
  128. fork[second].IsUsing = true;
  129. Console.WriteLine("Философ {0} оставил себе вилку {1}. И ждет освобождение второй вилки {2}", philosopherName, first, second);
  130. isWaitingFirstFork = true;
  131. }
  132.  
  133.  
  134. Program.s.Release();
  135. }
  136.  
  137.  
  138.  
  139. public void Start(object obj)
  140. {
  141. while (true)
  142. {
  143. Thread.Sleep(2000 + number * 1000);
  144. ChangeStatus();
  145. if (isHunger)
  146. GetFork((List<Fork>)obj);
  147. if (isDeath) break;
  148. }
  149. }
  150.  
  151. void ChangeStatus()
  152. {
  153.  
  154. if (!isHunger)
  155. {
  156. Console.WriteLine("Philosopher {0} thinking.", philosopherName);
  157. //Подумал и проголодался
  158. isHunger = true;
  159. }
  160. }
  161. }
  162.  
  163. public class Fork
  164. {
  165. bool isUsing = false;
  166.  
  167. public bool IsUsing
  168. {
  169. get { return isUsing; }
  170. set { isUsing = value; }
  171. }
  172. }
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement