Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading;
- namespace PPlab2GirlsTeam
- {
- class Program
- {
- public static Semaphore s = new Semaphore(3, 3);
- //Вилки
- static List<Fork> fork = new List<Fork>();
- //Философы
- static List<Philosopher> ph = new List<Philosopher>();
- static void Main(string[] args)
- {
- for (int i = 0; i < 5; i++)
- fork.Add(new Fork());
- for (int i = 0; i < 5; i++)
- ph.Add(new Philosopher((i).ToString(), i));
- Thread t1 = new Thread(ph[0].Start);
- Thread t2 = new Thread(ph[1].Start);
- Thread t3 = new Thread(ph[2].Start);
- Thread t4 = new Thread(ph[3].Start);
- Thread t5 = new Thread(ph[4].Start);
- t1.Start(fork);
- t2.Start(fork);
- t3.Start(fork);
- t4.Start(fork);
- t5.Start(fork);
- }
- }
- public class Philosopher
- {
- bool isHunger = false;
- string philosopherName;
- int number;
- //Философ взял одну вилку и ждет ее освобождения
- bool isWaitingFirstFork = false;
- bool isWaitingSecondFork = false;
- bool isDeath = false;
- public Philosopher(string Name, int number)
- {
- philosopherName = Name;
- this.number = number;
- }
- void GetFork(List<Fork> fork)
- {
- Console.WriteLine("Философ {0} ждет вилки.", philosopherName);
- Program.s.WaitOne();
- int first = number;
- int second = 10;
- switch (first)
- {
- case 0: second = 1; break;
- case 1: second = 2; break;
- case 2: second = 3; break;
- case 3: second = 4; break;
- case 4: second = 0; break;
- }
- //int second = (number + 1) % (fork.Count - 1);
- //Если философ голодный и у него есть Left вилка, то он ждет другую вилку Right
- if(isHunger && isWaitingFirstFork && !fork[second].IsUsing)
- {
- fork[second].IsUsing = true;
- Console.WriteLine("Философ {0} кушает.", philosopherName);
- Console.WriteLine("Вилки с номерами {0} и {1} заняты.", first, second);
- Thread.Sleep(1000);
- fork[first].IsUsing = false;
- fork[second].IsUsing = false;
- isWaitingFirstFork = false;
- isHunger = false;
- }
- //Если философ голодный и у него есть Second вилка, то он ждет другую вилку First
- if (isHunger && isWaitingSecondFork && !fork[first].IsUsing)
- {
- fork[first].IsUsing = true;
- Console.WriteLine("Философ {0} кушает.", philosopherName);
- Console.WriteLine("Вилки с номерами {0} и {1} заняты.", first, second);
- Thread.Sleep(1000);
- fork[first].IsUsing = false;
- fork[second].IsUsing = false;
- isWaitingFirstFork = false;
- isHunger = false;
- }
- //Если философ не ждет вилки и необходимые вилки свободоны
- if(isHunger && !isWaitingSecondFork && !isWaitingFirstFork && !fork[first].IsUsing && !fork[second].IsUsing)
- {
- //Если вилки свободны ко кушаем
- fork[first].IsUsing = true;
- fork[second].IsUsing = true;
- Console.WriteLine("Философ {0} кушает.", philosopherName);
- Console.WriteLine("Вилки с номерами {0} и {1} заняты.", first, second);
- Thread.Sleep(1000);
- fork[first].IsUsing = false;
- fork[second].IsUsing = false;
- isHunger = false;
- }
- //Если не ждет вилок, но только одна свободна, то занимаем ее
- if (isHunger && !isWaitingSecondFork && !isWaitingFirstFork && !fork[first].IsUsing && fork[second].IsUsing && number == 1)
- {
- //Если вилки свободны ко кушаем
- fork[first].IsUsing = true;
- Console.WriteLine("Философ оставил себе вилку {0}. И ждет освобождение второй вилки", first);
- isWaitingSecondFork = true;
- }
- //Если не ждет вилок, но только одна свободна, то занимаем ее
- if (isHunger && !isWaitingSecondFork && !isWaitingFirstFork && !fork[second].IsUsing && fork[first].IsUsing && number != 1)
- {
- //Если вилки свободны ко кушаем
- fork[second].IsUsing = true;
- Console.WriteLine("Философ {0} оставил себе вилку {1}. И ждет освобождение второй вилки {2}", philosopherName, first, second);
- isWaitingFirstFork = true;
- }
- Program.s.Release();
- }
- public void Start(object obj)
- {
- while (true)
- {
- Thread.Sleep(2000 + number * 1000);
- ChangeStatus();
- if (isHunger)
- GetFork((List<Fork>)obj);
- if (isDeath) break;
- }
- }
- void ChangeStatus()
- {
- if (!isHunger)
- {
- Console.WriteLine("Philosopher {0} thinking.", philosopherName);
- //Подумал и проголодался
- isHunger = true;
- }
- }
- }
- public class Fork
- {
- bool isUsing = false;
- public bool IsUsing
- {
- get { return isUsing; }
- set { isUsing = value; }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement