fel
le

Termelő-fogyasztó

Készítsünk többszálú, termelő-fogyasztó modellű megoldást az alábbiakra:

  • a puffer mérete maximum 400 elem,
  • három termelő kell
  • a termelők adott F számmal osztható random számokat állítanak elő, adott N mennyiségben, a 10000..80000 intervallumból
  • az első termelő 200 db 3-al osztható számot,
  • a második termelő 100 db, 5-el oszthatót,
  • a harmadik termelő 100 db, 7-el oszthatót,
  • három fogyasztó kell
  • az egyes fogyasztók az előállított random számokat kiírják a képernyőre, minden fogyasztó más-más színt használ (vörös, sárga, zöld).
  • a fogyasztók álljanak le, ha már a termelők által előállított összes számot kiírták.

Megoldás

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace TermeloFOgyaszto
{
    class Program
    {
        static public List<int> puffer= new List<int>();
        static public int counter=400;
        static public int eddigvolt=0;

        static public Random rnd = new Random();

        static void Main(string[] args)
        {
            Termelo t1 = new Termelo(3, 200);
            Termelo t2 = new Termelo(5, 100);
            Termelo t3 = new Termelo(7, 100);

            Thread szal1 = new Thread(t1.Termel);
            Thread szal2 = new Thread(t2.Termel);
            Thread szal3 = new Thread(t3.Termel);
            szal1.Start();
            szal2.Start();
            szal3.Start();

            Fogyaszto f1 = new Fogyaszto(ConsoleColor.Red);
            Fogyaszto f2 = new Fogyaszto(ConsoleColor.Yellow);
            Fogyaszto f3 = new Fogyaszto(ConsoleColor.Green);

            Thread szal4 = new Thread(f1.Fogyaszt);
            Thread szal5 = new Thread(f2.Fogyaszt);
            Thread szal6 = new Thread(f3.Fogyaszt);
            szal4.Start();
           
            szal5.Start();
            szal6.Start();
            szal4.Join();
            szal5.Join();
            szal6.Join();
            Console.ReadLine();
        }
    }

    class Termelo
    {
        public int db;

        public int oszthato;
        public Termelo(int n,int m)
        {
            oszthato = n;
            db = m;
        }

        public void Termel()
        {
            for (int i = 0; i < db; i++)
            {
                Monitor.Enter(Program.puffer);
                while (Program.puffer.Count >= 100)
                {
                    Monitor.Wait(Program.puffer);
                }
                int g = Program.rnd.Next(10000, 80000);
                while (g%oszthato==0)
                {
                    g = Program.rnd.Next(10000, 80000);
                }
                int sleep = Program.rnd.Next(1,5);
                Thread.Sleep(sleep);
                Program.puffer.Add(g);
                Monitor.Pulse(Program.puffer);
                Monitor.Exit(Program.puffer);
               
            }
            Console.WriteLine("A {0}-as szál leállt.", this.oszthato);
        }
    }

    class Fogyaszto
    {
        ConsoleColor c;
        public Fogyaszto(ConsoleColor c)
        {
            this.c = c;
        }

        public void Fogyaszt()
        {

            while (Program.counter > Program.eddigvolt)
            {
                Program.eddigvolt++;
                Monitor.Enter(Program.puffer);
                while (Program.puffer.Count == 0)
                {
                    Monitor.Wait(Program.puffer);
                }
                Console.ForegroundColor = c;
                Console.WriteLine(Program.puffer[0]);
                Program.puffer.RemoveAt(0);
                this.FejreszKiir();
                int sleep = Program.rnd.Next(3, 8);
                Thread.Sleep(sleep);
                Monitor.Pulse(Program.puffer);
                Monitor.Exit(Program.puffer);

            }
           
            Console.WriteLine("Fogyasztó szál leállt.");
        }

        public void FejreszKiir()
        {
            if (Program.puffer.Count == 0)
                Console.Title = "Üres";
            else
            {
                if (Program.puffer.Count >= 100)
                    Console.Title = Program.puffer.Count.ToString();
                //Console.Title = "Teli";
                else
                    Console.Title = Program.puffer.Count.ToString();
            }            
        }
    }
   
}
 

Egy hasonló feladat, de más megoldás

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net;
using System.Net.Sockets;

namespace TermeloEloszto
{

    class General
    {
        public int maxdb;
        public int oszt;
        public int db = 0;

        public General(int maxdb, int oszt)
        {
            this.maxdb = maxdb;
            this.oszt = oszt;
        }

        public void csinald()
        {
            while (db < maxdb)
            {
                int x = sorsol();
                Program.Hozzaad(x);
                db++;
                Program.osszsorsolt++;
            }

            lock (typeof(Program))
            {
                Console.ForegroundColor = ConsoleColor.Blue;
                Console.WriteLine(oszt + "-as típusú szál leállt");
            }
        }

        public int sorsol()                 // bármelyik száltól is jut el ida, az azokhoz tartozó feltételek szerint fog számot sorsolni
        {
            int x = 0;
            do
            {
                x = Program.rnd.Next(10000, 80000);
            }
            while (x % oszt != 0);

            return x;
        }

    }

    class Program
    {
        public static Random rnd = new Random();
        public static List<int> puffer = new List<int>(20);         // feladatban volt megadva, hogy a puffer csak 20 elemű lehet
        public static int osszsorsolt = 0;
        public static int maxossz = 1200;

        static public void Hozzaad(int x)
        {
            Monitor.Enter(puffer);
            while (puffer.Count >= 20)
            {
                Monitor.Wait(puffer);
            }
            puffer.Add(x);

            Monitor.Pulse(puffer);
            Monitor.Exit(puffer);
            System.Threading.Thread.Sleep(8);
        }

        static public int Kivesz()
        {
            Monitor.Enter(puffer);
            while (puffer.Count == 0)
            {
                Monitor.Wait(puffer);
            }

            int szam = puffer[0];
            puffer.RemoveAt(0);

            Monitor.Pulse(puffer);
            Monitor.Exit(puffer);
            return szam;
        }

        static void sarganKiir()
        {
            while (osszsorsolt != Program.maxossz || puffer.Count != 0)
            {
                lock (typeof(Program))
                {
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.Write(" " + Kivesz() + " ");
                    Console.WriteLine();
                }
                System.Threading.Thread.Sleep(18);
            }
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine("Az sárga szál leállt.");
        }

        static void pirosanKiir()
        {
            while (osszsorsolt != Program.maxossz || puffer.Count != 0)
            {
                lock (typeof(Program))
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.Write(" " + Kivesz() + " ");
                    Console.WriteLine();
                }
                System.Threading.Thread.Sleep(18);
            }
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine("Az piros szál leállt.");
        }


        static void Main(string[] args)
        {
            var ottel = new General(400, 5);
            //ottel.db = 400;
            //ottel.oszt = 5;
            var ot = new Thread(ottel.csinald);

            var harommal = new General(500, 3);
            //harommal.db = 500;
            //harommal.oszt = 3;
            var harom = new Thread(harommal.csinald);

            var hettel = new General(300, 7);
            //hettel.db = 300;
            //hettel.oszt = 7;
            var het = new Thread(hettel.csinald);

            Thread sarga = new Thread(sarganKiir);
            Thread piros = new Thread(pirosanKiir);


            ot.Start();
            harom.Start();
            het.Start();
            sarga.Start();
            piros.Start();

            ot.Join();
            harom.Join();
            het.Join();
            sarga.Join();
            piros.Join();



            Console.ReadLine();


        }
    }
}
 
Hernyák Zoltán
2013-04-15 14:02:03