Last active
January 25, 2018 18:02
-
-
Save denisivan0v/a2c96f3f70cf83ed6339ff49c58c83fc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Threading; | |
using System.Threading.Tasks; | |
namespace ConsoleApp1 | |
{ | |
public static class Program | |
{ | |
private static readonly SemaphoreSlim[] Forks = | |
{ | |
new SemaphoreSlim(1), | |
new SemaphoreSlim(1), | |
new SemaphoreSlim(1), | |
new SemaphoreSlim(1), | |
new SemaphoreSlim(1) | |
}; | |
private static void Main(string[] args) | |
{ | |
var p1 = new Philosopher("p1", Forks[0], Forks[1]); | |
var p2 = new Philosopher("p2", Forks[1], Forks[2]); | |
var p3 = new Philosopher("p3", Forks[2], Forks[3]); | |
var p4 = new Philosopher("p4", Forks[3], Forks[4]); | |
var p5 = new Philosopher("p5", Forks[4], Forks[0]); | |
var philosophers = new[] {p1, p2, p3, p4, p5}; | |
var tasks = new List<Task>(); | |
foreach (var philosopher in philosophers) | |
{ | |
var task = Task.Run( | |
() => | |
{ | |
lock (Forks) | |
{ | |
philosopher.LeftFork.Wait(); | |
Console.WriteLine($"Philosopher {philosopher.Name} took the left fork"); | |
philosopher.RightFork.Wait(); | |
Console.WriteLine($"Philosopher {philosopher.Name} took the right fork"); | |
} | |
Thread.Sleep(1000); | |
philosopher.LeftFork.Release(); | |
philosopher.RightFork.Release(); | |
Console.WriteLine($"Philosopher {philosopher.Name} done."); | |
}); | |
tasks.Add(task); | |
} | |
Task.WaitAll(tasks.ToArray()); | |
} | |
private class Philosopher | |
{ | |
public Philosopher(string name, SemaphoreSlim leftFork, SemaphoreSlim rightFork) | |
{ | |
Name = name; | |
LeftFork = leftFork; | |
RightFork = rightFork; | |
} | |
public string Name { get; } | |
public SemaphoreSlim LeftFork { get; } | |
public SemaphoreSlim RightFork { get; } | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment