Esempio n. 1
0
        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 });
        }
Esempio n. 2
0
        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();
            }
        }