using System.Collections.Generic;
using System.Threading.Tasks;
static public void Eat(object leftChopstick, object rightChopstick, int philosopherNo, int leftChopstickNo, int rightChopstickNo)
Console.WriteLine(" Philosopher {0} picked {1} chopstick.", philosopherNo, leftChopstickNo);
Console.WriteLine(" Philosopher {0} picked {1} chopstick.", philosopherNo, rightChopstickNo);
Console.WriteLine("Philosopher {0} eats.", philosopherNo);
Console.WriteLine(" Philosopher {0} released {1} chopstick.", philosopherNo, rightChopstickNo);
Console.WriteLine(" Philosopher {0} released {1} chopstick.", philosopherNo, leftChopstickNo);
static void Main(string[] args)
const int numofPhilosophers = 5;
var chopsticks = new Dictionary<int, object>(numofPhilosophers);
for (int i = 0; i < numofPhilosophers; ++i)
chopsticks.Add(i, new object());
Task[] tasks = new Task[numofPhilosophers];
tasks[0] = new Task(() => Philoshoper.Eat(chopsticks[0], chopsticks[numofPhilosophers - 1], 0 + 1, 1, numofPhilosophers));
for (int i = 1; i < numofPhilosophers; ++i)
tasks[ix] = new Task(() => Philoshoper.Eat(chopsticks[ix - 1], chopsticks[ix], ix + 1, ix, ix + 1));
Parallel.ForEach(tasks, t =>