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