예제 #1
0
 static private void OdluciStoSaVilicom(Intracommunicator comm, Vilica Vilica, int susjed)
 {
     if (Vilica.ImamVilicu)
     {
         if (Vilica.Stanje == StanjeVilice.cisto)
         {
             return;
         }
         else if (Vilica.Stanje == StanjeVilice.prljavo)
         {
             string pomak = "";
             Vilica.ImamVilicu = false;
             for (int p = 0; p < comm.Rank; p++)
             {
                 pomak += RAZMAK;
             }
             System.Console.WriteLine(pomak + "SaljemVilicu" + susjed);
             comm.Send <bool>(true, susjed, 1);
         }
     }
 }
예제 #2
0
        static void Main(string[] args)
        {
            using (new MPI.Environment(ref args))
            {
                Vilica LijevaVilica = null;
                Vilica DesnaVilica  = null;
                bool   lijeviToken  = false;
                bool   desniToken   = false;
                int    lijeviSusjed = -1;
                int    desniSusjed  = -1;
                string pomak        = "";

                //Inicijalizacija

                Intracommunicator comm = Communicator.world;
                int idProcesa          = comm.Rank;
                lijeviSusjed = (idProcesa - 1);
                lijeviSusjed = lijeviSusjed >= 0 ? lijeviSusjed : (comm.Size - 1);
                desniSusjed  = (idProcesa + 1);
                desniSusjed  = desniSusjed <= (comm.Size - 1) ? desniSusjed : 0;

                for (int w = 0; w < idProcesa; w++)
                {
                    pomak += RAZMAK;
                }
                System.Console.WriteLine(pomak + "Filozof" + idProcesa);

                if (idProcesa == 0)
                {
                    LijevaVilica = new Vilica(IMAMVILICU);
                    DesnaVilica  = new Vilica(IMAMVILICU);
                }
                else if (idProcesa == (comm.Size - 1))
                {
                    DesnaVilica  = new Vilica(NEMAMVILICU);
                    LijevaVilica = new Vilica(NEMAMVILICU);
                    lijeviToken  = true;
                    desniToken   = true;
                }
                else
                {
                    DesnaVilica  = new Vilica(IMAMVILICU);
                    LijevaVilica = new Vilica(NEMAMVILICU);
                    lijeviToken  = true;
                }

                /*********************************************/
                //Nakon inicijalizacije beskonacno ponavljaj

                while (true)
                {
                    bool PorukaOdLijevogSusjeda = false;
                    bool PorukaOdDesnogSusjeda  = false;
                    //Misli
                    Random rand         = new Random();
                    int    sleepingTime = rand.Next(MAXSLEEPINGTIME);
                    System.Console.WriteLine(pomak + "Mislim" + idProcesa);
                    for (int j = 0; j < sleepingTime; j++)
                    {
                        PorukaOdLijevogSusjeda = ProvjeriPorukeSusjeda(comm, lijeviSusjed);
                        PorukaOdDesnogSusjeda  = ProvjeriPorukeSusjeda(comm, desniSusjed);
                        if (PorukaOdLijevogSusjeda)
                        {
                            comm.Receive <bool>(lijeviSusjed, 0);
                            lijeviToken = true;
                        }
                        if (PorukaOdDesnogSusjeda)
                        {
                            comm.Receive <bool>(desniSusjed, 0);
                            desniToken = true;
                        }
                        if (lijeviToken)
                        {
                            OdluciStoSaVilicom(comm, LijevaVilica, lijeviSusjed);
                        }
                        if (desniToken)
                        {
                            OdluciStoSaVilicom(comm, DesnaVilica, desniSusjed);
                        }
                        System.Threading.Thread.Sleep(1000);
                    }

                    //Gladan
                    System.Console.WriteLine(pomak + "Gladan" + idProcesa);
                    while (true)
                    {
                        //Pogledaj jel netko šta treba
                        PorukaOdDesnogSusjeda  = false; PorukaOdDesnogSusjeda = false;
                        PorukaOdLijevogSusjeda = ProvjeriPorukeSusjeda(comm, lijeviSusjed);
                        PorukaOdDesnogSusjeda  = ProvjeriPorukeSusjeda(comm, desniSusjed);
                        if (PorukaOdLijevogSusjeda)
                        {
                            comm.Receive <bool>(lijeviSusjed, 0);
                            lijeviToken = true;
                        }
                        if (PorukaOdDesnogSusjeda)
                        {
                            comm.Receive <bool>(desniSusjed, 0);
                            desniToken = true;
                        }
                        if (lijeviToken)
                        {
                            OdluciStoSaVilicom(comm, LijevaVilica, lijeviSusjed);
                        }
                        if (desniToken)
                        {
                            OdluciStoSaVilicom(comm, DesnaVilica, desniSusjed);
                        }
                        //Pogledaj svoje osobne potrebe
                        if (LijevaVilica.ImamVilicu && DesnaVilica.ImamVilicu)
                        {
                            break;
                        }
                        else
                        {
                            if (!LijevaVilica.ImamVilicu)
                            {
                                if (SaljeLiNetkoVilicu(comm, lijeviSusjed))
                                {
                                    System.Console.WriteLine(pomak + "PrimamVilicu" + lijeviSusjed);
                                    comm.Receive <bool>(lijeviSusjed, 1);
                                    LijevaVilica.ImamVilicu = true;
                                    LijevaVilica.OcistiVilicu();
                                }
                            }
                            if (!LijevaVilica.ImamVilicu)
                            {
                                if (lijeviToken)
                                {
                                    TraziVilicu(comm, lijeviSusjed);
                                    lijeviToken = false;
                                }
                            }
                            if (!DesnaVilica.ImamVilicu)
                            {
                                if (SaljeLiNetkoVilicu(comm, desniSusjed))
                                {
                                    System.Console.WriteLine(pomak + "PrimamVilicu" + desniSusjed);
                                    comm.Receive <bool>(desniSusjed, 1);
                                    DesnaVilica.ImamVilicu = true;
                                    DesnaVilica.OcistiVilicu();
                                }
                            }
                            if (!DesnaVilica.ImamVilicu)
                            {
                                if (desniToken)
                                {
                                    TraziVilicu(comm, desniSusjed);
                                    desniToken = false;
                                }
                            }
                        }
                    }


                    //Jedi
                    rand = new Random();
                    int eatingTime = rand.Next(MAXSEATINGTIME);
                    System.Console.WriteLine(pomak + "Jedem" + idProcesa);
                    LijevaVilica.ZaprljajVilicu(); DesnaVilica.ZaprljajVilicu();
                    System.Threading.Thread.Sleep(eatingTime);

                    //Provjeri treba li netko vilicu
                    PorukaOdDesnogSusjeda  = false; PorukaOdDesnogSusjeda = false;
                    PorukaOdLijevogSusjeda = ProvjeriPorukeSusjeda(comm, lijeviSusjed);
                    PorukaOdDesnogSusjeda  = ProvjeriPorukeSusjeda(comm, desniSusjed);
                    if (PorukaOdLijevogSusjeda)
                    {
                        comm.Receive <bool>(lijeviSusjed, 0);
                        lijeviToken = true;
                    }
                    if (PorukaOdDesnogSusjeda)
                    {
                        comm.Receive <bool>(desniSusjed, 0);
                        desniToken = true;
                    }
                    if (lijeviToken)
                    {
                        OdluciStoSaVilicom(comm, LijevaVilica, lijeviSusjed);
                    }
                    if (desniToken)
                    {
                        OdluciStoSaVilicom(comm, DesnaVilica, desniSusjed);
                    }
                }
            }
        }