using System.Collections.Generic;
using System.Threading.Tasks;
private static State[] _states;
private static bool[] _forks;
private static void Setup(int n)
_states = Enumerable.Repeat(State.Thinking, n).ToArray();
_forks = Enumerable.Repeat(true, n).ToArray();
private static void Run(int id)
var random = new Random();
var leftFork = (id - 1) % _forks.Length;
var rightFork = (id + 1) % _forks.Length;
if (!_forks[leftFork] || !_forks[rightFork]) continue;
lock (_forks) lock(_states)
Console.WriteLine($"{id} is starting to eat");
_forks[leftFork] = false;
_forks[rightFork] = false;
_states[id] = State.Eating;
Thread.Sleep(TimeSpan.FromSeconds(random.Next(1, 5)));
lock (_forks) lock(_states)
Console.WriteLine($"{id} finished eating");
_forks[rightFork] = true;
_states[id] = State.Thinking;
public static void Main(string[] args)
var tasks = new List<Task>();
for (var i = 0; i < count; i++)
tasks.Add(Task.Factory.StartNew(() => Run(icopy)));
Task.WaitAll(tasks.ToArray());