public void GiveForks(Fork leftFork, Fork rightFork, int philosopherNum, int thinkingTime, int eatingTime) { Console.WriteLine("\tPhilosopher {0} is speaking", philosopherNum); Thread.Sleep(thinkingTime * 1000); if (leftFork.IsChosen || rightFork.IsChosen) { Console.WriteLine("\tPhilosopher {0} is waiting for free forks", philosopherNum); } semaphore.WaitOne(); lock (leftFork) { leftFork.IsChosen = true; //Console.WriteLine("\tPhilosopher {0} took fork {1}", philosopherNum, leftFork.Number); { lock (rightFork) { leftFork.IsChosen = true; //Console.WriteLine("\tPhilosopher {0} took fork {1}", philosopherNum, rightFork.Number); Console.WriteLine("Philosopher {0} is eating", philosopherNum); Thread.Sleep(eatingTime * 1000); } rightFork.IsChosen = false; //Console.WriteLine("\tPhilosopher {0} released fork {1}", philosopherNum, rightFork.Number); } } leftFork.IsChosen = false; //Console.WriteLine("\tPhilosopher {0} released fork {1}", philosopherNum, leftFork.Number); semaphore.Release(1); }
private void InitializeDinerState(int id, Fork leftFork, Fork rightFork) { ID = id; LeftFork = leftFork; RightFork = rightFork; State = DinerState.TryingToGetForks; }
private static double Dine(int index, Fork firstFork, Fork secondFork, int maxThinkingTime, int maxEatingTime, CancellationToken cancellationToken) { var watch = new Stopwatch(); while (!cancellationToken.IsCancellationRequested) { var thinkingTime = RandomInRange(0, maxThinkingTime); Thread.Sleep(thinkingTime); Console.WriteLine($"Phil{index.ToString()} finished thinking"); watch.Start(); lock (firstFork) { watch.Stop(); Console.WriteLine($"Phil{index.ToString()} took first fork: {firstFork.Position.ToString()}"); watch.Start(); lock (secondFork) { watch.Stop(); Console.WriteLine($"Phil{index.ToString()} took second fork: {secondFork.Position.ToString()}"); Thread.Sleep(RandomInRange(0, maxEatingTime)); Console.WriteLine($"Phil{index.ToString()} is done eating"); } } } return(watch.Elapsed.TotalMilliseconds); }
public Philosopher(int nPhilospher, Fork left, Fork right) { this.nPhilospher = nPhilospher; firstFork = left.Id < right.Id ? left : right; secondFork = left.Id < right.Id ? right : left; }
public Philosopher(int number, Fork leftFork, Fork rightFork) { this.number = number; this.leftFork = leftFork; this.rightFork = rightFork; start(); }
public void Eat(Fork leftFork, Fork rightFork) { while (true) { Waiter.Instance.GiveForks(leftFork, rightFork, Number, SpeakingTime, EatingTime); } }
void grabFork(Fork equipFork) { Random rnd = new Random(); int tries = rnd.Next(10); Console.WriteLine($"philosoph {number} is trying to grab fork{equipFork.Id}, {tries} times"); int counter = 0; while (counter < tries) { if (Monitor.TryEnter(equipFork)) { Console.WriteLine($"Philosopher {number} took fork {equipFork.Id}"); try { //Eat for a random amount of time Eat(); Thread.Sleep(rnd.Next(3000)); break; } finally { Console.WriteLine($"Philosopher {number} let go of fork{equipFork.Id}"); } } else { Console.WriteLine($"Philosopher {number} could not get fork {equipFork.Id}"); } counter++; Thread.Sleep(2000); } }
public Philosopher(int nPhilospher, Fork left, Fork right) { this.nPhilospher = nPhilospher; firstFork = left; secondFork = right; }
public Philosopher(int nPhilospher, Fork left, Fork right, SemaphoreSlim tableSemaphore) { this.tableSemaphore = tableSemaphore; this.nPhilospher = nPhilospher; firstFork = left.Id < right.Id ? left : right; secondFork = left.Id < right.Id ? right : left; }
public Philosopher(int name, Fork leftFork, Fork rightFork, Philosopher allPhilosopher) { this.Name = name; this._leftFork = leftFork; this._rightFork = rightFork; //this._allPhilosophers = allPhilosopher; this._rnd = new Random(this.Name); }
static public void Eat(Fork leftFork, Fork rightFork, int philosopherNumber, int leftForkNumber, int rightForkNumber) { while (true) { Stopwatch timePerParse2; long ticksThisTime = 0; // philosopher thinks Random r = new Random(); int thinking_time = r.Next(0, 5000); Console.WriteLine("Philosopher {0} thinks.", philosopherNumber); Thread.Sleep(thinking_time); timePerParse2 = Stopwatch.StartNew(); Console.WriteLine("Philosopher {0} wants to take Forks.", philosopherNumber); Fork first = leftFork; Fork second = rightFork; int firstFork = leftForkNumber; int secondFork = rightForkNumber; int even = philosopherNumber % 2; // switch forks if (even == 0) { first = rightFork; firstFork = rightForkNumber; second = leftFork; secondFork = leftForkNumber; } lock (first) { timePerParse2.Stop(); ticksThisTime = timePerParse2.ElapsedTicks; Console.WriteLine("Philosopher {0} was waiting for " + ticksThisTime + "ms", philosopherNumber); Console.WriteLine("Philosopher {0} picked {1} Fork.", philosopherNumber, firstFork); lock (second) { // philosopher eats Console.WriteLine("Philosopher {0} picked {1} Fork.", philosopherNumber, secondFork); Console.WriteLine("Philosopher {0} eats.", philosopherNumber); int eating_time = r.Next(0, 10000); Thread.Sleep(eating_time); Console.WriteLine("Philosopher {0} stops eating.", philosopherNumber); } Console.WriteLine("Philosopher {0} released {1} Fork.", philosopherNumber, secondFork); } Console.WriteLine("Philosopher {0} released {1} Fork.", philosopherNumber, firstFork); } }
public Philosopher(int index, string name, TimeSpan thinkingTime, TimeSpan eatingTime, Fork leftFork, Fork rightFork) { _index = index; _thinkingTime = thinkingTime; _eatingTime = eatingTime; _leftFork = leftFork; _rightFork = rightFork; Name = name; _random = new Random(); _thread = new Thread(DinnerLoop); _thread.Start(); }
public void Start() { Console.WriteLine("Start process"); for (int i = 0; i < philosophersNum; i++) { int ix = i; Fork leftFork = forks[ix]; Fork rightFork = (ix == 0) ? forks[philosophersNum - 1] : forks[ix - 1]; Thread thread = new Thread(() => philosophers[ix].Eat(leftFork, rightFork)); threads.Add(thread); thread.Start(); } }
public DiningProcess(int philNumb) { philosophersNum = philNumb; forks = new List <Fork>(); philosophers = new List <Philosopher>(); threads = new List <Thread>(); for (int i = 0; i < philosophersNum; i++) { Philosopher philosopher = new Philosopher(i); philosophers.Add(philosopher); Fork fork = new Fork(i); forks.Add(fork); } Waiter.Instance.InitWaiter(forks); }
public static void Eat(Fork leftFork, Fork rightFork, int philosopherNumber, int leftForkNumber, int rightForkNumber) { while (true) { // philosopher thinks Random r = new Random(); int thinkingTime = r.Next(0, 5000); Console.WriteLine($"Philosopher {philosopherNumber} thinks."); Thread.Sleep(thinkingTime); Console.WriteLine($"Philosopher {philosopherNumber} wants to take Forks."); Fork first = leftFork; Fork second = rightFork; int firstFork = leftForkNumber; int secondFork = rightForkNumber; bool isEven = philosopherNumber % 2 == 0; // switch forks to prevent deadlock if (isEven) { first = rightFork; firstFork = rightForkNumber; second = leftFork; secondFork = leftForkNumber; } lock (first) { Console.WriteLine("Philosopher {0} picked {1} Fork.", philosopherNumber, firstFork); // not needed because of deadlock prevention above //lock (second) //{ // philosopher eats Console.WriteLine("Philosopher {0} picked {1} Fork.", philosopherNumber, secondFork); Console.WriteLine("Philosopher {0} eats.", philosopherNumber); int eating_time = r.Next(0, 10000); Thread.Sleep(eating_time); // TODO: do not use Thread.Sleep() inside a task -> pauses ALL tasks on the thread (could be multiple) Console.WriteLine("Philosopher {0} stops eating.", philosopherNumber); //} Console.WriteLine("Philosopher {0} released {1} Fork.", philosopherNumber, secondFork); } Console.WriteLine("Philosopher {0} released {1} Fork.", philosopherNumber, firstFork); } }
static public void Eat(Fork leftFork, Fork rightFork, int philosopherNumber, int leftForkNumber, int rightForkNumber) { while (true) { // philosopher thinks Random r = new Random(); int thinking_time = r.Next(0, 5000); Console.WriteLine("Philosopher {0} thinks.", philosopherNumber); Thread.Sleep(thinking_time); Console.WriteLine("Philosopher {0} wants to take Forks.", philosopherNumber); Fork first = leftFork; Fork second = rightFork; int firstFork = leftForkNumber; int secondFork = rightForkNumber; int even = philosopherNumber % 2; // switch forks to prevent deadlock if (even == 0) { first = rightFork; firstFork = rightForkNumber; second = leftFork; secondFork = leftForkNumber; } lock (first) { Console.WriteLine("Philosopher {0} picked {1} Fork.", philosopherNumber, firstFork); // not needed because of deadlock prevention above //lock (second) //{ // philosopher eats Console.WriteLine("Philosopher {0} picked {1} Fork.", philosopherNumber, secondFork); Console.WriteLine("Philosopher {0} eats.", philosopherNumber); int eating_time = r.Next(0, 10000); Thread.Sleep(eating_time); Console.WriteLine("Philosopher {0} stops eating.", philosopherNumber); //} Console.WriteLine("Philosopher {0} released {1} Fork.", philosopherNumber, secondFork); } Console.WriteLine("Philosopher {0} released {1} Fork.", philosopherNumber, firstFork); } }
public DiningTable(int nPhilosophers) { Fork[] forks = new Fork[nPhilosophers]; for (int nFork = 0; nFork < nPhilosophers; nFork++) { forks[nFork] = new Fork(nFork); } philosophers = new Philosopher[nPhilosophers]; for (int nPhilospher = 0; nPhilospher < philosophers.Length; nPhilospher++) { philosophers[nPhilospher] = new Philosopher(nPhilospher, forks[nPhilospher], forks[(nPhilospher + 1) % nPhilosophers]); } }
public Table(int number) { this.NumOfPhilosophers = number; this.philosophers = new Philosopher[NumOfPhilosophers]; this.forks = new Fork[NumOfPhilosophers]; for (int i = 0; i < forks.Length; i++) { forks[i] = new Fork(i); } for (int i = 0; i < NumOfPhilosophers; i++) { Fork right = forks[i]; Fork left = forks[(i + 1) % NumOfPhilosophers]; philosophers[i] = new Philosopher(i, left, right); } }
public DiningTable(int nPhilosophers) { Fork[] forks = new Fork[nPhilosophers]; for (int nFork = 0; nFork < nPhilosophers; nFork++) { forks[nFork] = new Fork(nFork); } philosophers = new Philosopher[nPhilosophers]; SemaphoreSlim tableSemaphore = new SemaphoreSlim(nPhilosophers / 2); for (int nPhilospher = 0; nPhilospher < philosophers.Length; nPhilospher++) { philosophers[nPhilospher] = new Philosopher(nPhilospher, forks[nPhilospher], forks[(nPhilospher + 1) % nPhilosophers], tableSemaphore); } }
public TableViewModel() { PhilosopherThinkingTime = "2000"; fork1 = new Fork(); fork2 = new Fork(); fork3 = new Fork(); fork4 = new Fork(); fork5 = new Fork(); philosopher1 = new Philosopher("1", fork1, fork2); philosopher2 = new Philosopher("2", fork2, fork3); philosopher3 = new Philosopher("3", fork3, fork4); philosopher4 = new Philosopher("4", fork4, fork5); philosopher5 = new Philosopher("5", fork5, fork1); this.RunCommand = new RelayCommand(this.OnRun, this.CanRun); this.StopCommand = new RelayCommand(this.OnStop, this.CanStop); }
public static void Init() { Philosopher[] tmpP = new Philosopher[numberOfPhilosophers]; Fork[] tmpF = new Fork[numberOfPhilosophers]; for (int i = 0; i < numberOfPhilosophers; i++) { tmpF[i] = Fork.Create(); } for (int i = 0; i < numberOfPhilosophers; i++) { Philosopher p = Philosopher.Create(); p.left = tmpF[i]; p.right = tmpF[(i + 1) % numberOfPhilosophers]; tmpP[i] = p; } for (int i = 0; i < numberOfPhilosophers; i++) { phils = phils.Add(tmpP[i]); } mode = Mode.Running; }
public Philosopher(string name, Fork left, Fork right) { this.name = name; this.left = left; this.right = right; }
public Philosopher(string name, Fork leftfork, Fork rightfork) { this.Name = name; leftFork = leftfork; rightFork = rightfork; }
private static int GetForkHolder(Fork fork) { return(Diners.Single(d => d.CurrentlyHeldForks.Contains(fork)).ID); }
private static bool ForkIsBeingUsed(Fork fork) { return(Diners.Count(d => d.CurrentlyHeldForks.Contains(fork)) > 0); }
private static string FormatForkState(Fork fork) { return(!ForkIsBeingUsed(fork) ? " " : "D" + GetForkHolder(fork)); }
public Philosopher(int number, Fork left, Fork right) { this.Number = number; this.left = left; this.right = right; }
public Philosopher(string name, Fork leftFork, Fork rightFork) { Name = name; LeftFork = leftFork; RightFork = rightFork; }
public Diner(int id, Fork leftFork, Fork rightFork) { InitializeDinerState(id, leftFork, rightFork); BeginDinerActivity(); }