static void ConsumeAll() { while (true) { _gate.WaitOne(); if (_queueForGate.Any()) { ValuableRessource result = _queueForGate.Dequeue(); Console.WriteLine($"# Gate dequeued: {result.Key}:{result.Value}"); Thread.Sleep(10); } } }
static void Consume(string name) { lock (_token) { while (true) { Monitor.Wait(_token); if (_queue.Any()) { ValuableRessource result = _queue.Dequeue(); Console.WriteLine($"{name} dequeued: {result.Key}:{result.Value}"); } } } }
static void ConsumeTurnstile() { while (true) { _turnstile.WaitOne(); lock (_token2) { if (_queueForTurnstile.Any()) { ValuableRessource result = _queueForTurnstile.Dequeue(); Console.WriteLine($"+ Turn dequeued: {result.Key}:{result.Value}"); Thread.Sleep(10); } } } }
static void FetchRessource(int fetcher, int target, int distance) { try { if (_ressources.Any(x => x.Key == target)) { Console.WriteLine($"Fetcher-{fetcher} Ressource found ... takes {distance} to reach"); Thread.Sleep(distance); Console.WriteLine($"Fetcher-{fetcher} - Checking Lock"); lock (_token) { Console.WriteLine($"Fetcher-{fetcher} - Locked Ressource"); Thread.Sleep(100); ValuableRessource taken = _ressources.FirstOrDefault(x => x.Key == target); _ressources.Remove(taken); string result = taken != null ? taken.Value + " is taken" : "Ressource was removed before"; Console.WriteLine($"Fetcher-{fetcher} - " + result); } Console.WriteLine($"Fetcher-{fetcher} - Release Lock"); } else { Console.WriteLine($"Fetcher-{fetcher} - Ressource not found"); } } catch (System.Exception) { } }
static void FetchRessource(int fetcher, int target, int distance) { bool abortFetch = false; try { Console.WriteLine($"Fetcher-{fetcher} waiting for ReadLock"); _token.EnterReadLock(); Console.WriteLine($"Fetcher-{fetcher} >>> EnterReadLock"); Console.WriteLine($"Fetcher-{fetcher} Checking Ressource"); Thread.Sleep(50); if (_ressources.Any(x => x.Key == target)) { Console.WriteLine($"Fetcher-{fetcher} - Ressource found -> will fetch"); } else { Console.WriteLine($"Fetcher-{fetcher} - Ressource not found -> Abort"); abortFetch = true; } } finally { _token.ExitReadLock(); Console.WriteLine($"Fetcher-{fetcher} <<< ExitReadLock"); } if (abortFetch) { return; } Console.WriteLine($"Fetcher-{fetcher} Ressource found ... takes {distance} to reach"); Thread.Sleep(distance); try { Console.WriteLine($"Fetcher-{fetcher} waiting for WriteLock"); _token.EnterWriteLock(); Console.WriteLine($"Fetcher-{fetcher} >>> EnterWriteLock"); if (_ressources.Any(x => x.Key == target)) { Console.WriteLine($"Fetcher-{fetcher} - Ressource still present -> taking"); Thread.Sleep(100); ValuableRessource taken = _ressources.FirstOrDefault(x => x.Key == target); _ressources.Remove(taken); Console.WriteLine($"Fetcher-{fetcher} - Ressource taken"); } else { Console.WriteLine($"Fetcher-{fetcher} - Ressource already teaken -> abort"); } } finally { _token.ExitWriteLock(); Console.WriteLine($"Fetcher-{fetcher} <<< ExitWriteLock"); } }