private static Thread[] StartFactories(GlobalState globalState, out FactoryData[] factoryDatas) { var factoryDataLead = new FactoryData(Resource.Lead, globalState); var factoryDataMercury = new FactoryData(Resource.Mercury, globalState); var factoryDataSulfur = new FactoryData(Resource.Sulfur, globalState); factoryDatas = new[] { factoryDataLead, factoryDataMercury, factoryDataSulfur }; var factoryLead = new Thread(() => ThreadFunctions.Factory(factoryDataLead, Constants.FactoryMinTime, Constants.FactoryMaxTime, Constants.FactoryLeadSeed)); var factoryMercury = new Thread(() => ThreadFunctions.Factory(factoryDataMercury, Constants.FactoryMinTime, Constants.FactoryMaxTime, Constants.FactoryMercurySeed)); var factorySulfur = new Thread(() => ThreadFunctions.Factory(factoryDataSulfur, Constants.FactoryMinTime, Constants.FactoryMaxTime, Constants.FactorySulfurSeed)); factoryLead.Start(); factoryMercury.Start(); factorySulfur.Start(); return(new[] { factoryLead, factoryMercury, factorySulfur }); }
public static void Factory(FactoryData data, int minTime, int maxTime, int seed) { var resource = (int)data.Resource; var rand = new Random(seed); while (true) { data.GlobalState.MagazineSemaphores[resource].WaitOne(); data.NoCurseSemaphore.WaitOne(); data.NoCurseSemaphore.Release(); Thread.Sleep(rand.Next(minTime, maxTime)); data.GlobalState.ChangeSemaphore.WaitOne(); data.GlobalState.ResourcesReady[resource]++; Console.WriteLine("Produced " + data.Resource); data.GlobalState.AllTypesCheckAndWake(); data.GlobalState.ChangeSemaphore.Release(); } }