Skip to content

Instantly share code, notes, and snippets.

@denisivan0v
Last active January 25, 2018 18:02
Show Gist options
  • Save denisivan0v/a2c96f3f70cf83ed6339ff49c58c83fc to your computer and use it in GitHub Desktop.
Save denisivan0v/a2c96f3f70cf83ed6339ff49c58c83fc to your computer and use it in GitHub Desktop.
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