示例#1
0
        //Provjeri ima li zahtjeva (tag = 0) ili odgovora (tag = 1, iliti vilica koja se salje)
        static public bool imaliporuka(Intracommunicator comm, int susjed, int tag)
        {
            var status = comm.ImmediateProbe(susjed, tag);

            if (status != null)
            {
                return(true);
            }
            return(false);
        }
示例#2
0
        static private bool CheckForMessage(int neighbourId, Intracommunicator comm)
        {
            var check = comm.ImmediateProbe(neighbourId, 0);

            if (check != null)
            {
                return(true);
            }
            return(false);
        }
示例#3
0
        static private bool SaljeLiNetkoVilicu(Intracommunicator comm, int susjed)
        {
            var flag = comm.ImmediateProbe(susjed, 1);

            if (flag != null)
            {
                return(true);
            }
            return(false);
        }
示例#4
0
        static private bool ProvjeriPorukeSusjeda(Intracommunicator comm, int susjed)
        {
            var flag = comm.ImmediateProbe(susjed, 0);

            if (flag != null)
            {
                return(true);
            }
            return(false);
        }
示例#5
0
 static private bool ProvjeriPorukeSusjeda(Intracommunicator comm, int susjed)
 {
     if (comm.ImmediateProbe(susjed, 0) != null)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
示例#6
0
        public bool ProbeMessage()
        {
            Status status = _comm.ImmediateProbe(Communicator.anySource, Communicator.anyTag);

            return(status != null);
        }
示例#7
0
        static void Main(string[] args)
        {
            using (new MPI.Environment(ref args))
            {
                Vilica lijevaVilica = new Vilica();
                Vilica desnaVilica  = new Vilica();
                bool   lijeviToken  = false;
                bool   desniToken   = false;
                string pomak        = "";

                //Inicijalizacija
                Intracommunicator comm = Communicator.world;
                int procesId           = comm.Rank;
                int lijeviSusjed       = (procesId - 1);
                int desniSusjed        = (procesId + 1);

                if (lijeviSusjed < 0)
                {
                    lijeviSusjed = comm.Size - 1;
                }
                if (desniSusjed > comm.Size - 1)
                {
                    desniSusjed = 0;
                }

                for (int i = 0; i < procesId; ++i)
                {
                    pomak += RAZMAK;
                }

                Console.WriteLine(pomak + "Filozof " + procesId);

                if (procesId == 0)
                {
                    lijevaVilica.ImamVilicu = true;
                    desnaVilica.ImamVilicu  = true;
                }
                else if (procesId == (comm.Size - 1))
                {
                    desnaVilica.ImamVilicu  = false;
                    lijevaVilica.ImamVilicu = false;
                    lijeviToken             = true;
                    desniToken = true;
                }
                else
                {
                    desnaVilica.ImamVilicu  = true;
                    lijevaVilica.ImamVilicu = false;
                    lijeviToken             = true;
                }

                //beskonacno ponavljaj
                while (true)
                {
                    bool porukaLijevogSusjeda;
                    bool porukaDesnogSusjeda;

                    //Misli
                    Random rand         = new Random();
                    int    thinkingTime = rand.Next(2, 5);
                    Console.WriteLine(pomak + "Mislim");
                    for (int a = 0; a < thinkingTime; ++a)
                    {
                        porukaLijevogSusjeda = ProvjeriPorukeSusjeda(comm, lijeviSusjed);
                        porukaDesnogSusjeda  = ProvjeriPorukeSusjeda(comm, desniSusjed);
                        if (porukaLijevogSusjeda)
                        {
                            comm.Receive <bool>(lijeviSusjed, 0);
                            lijeviToken = true;
                        }
                        if (porukaDesnogSusjeda)
                        {
                            comm.Receive <bool>(desniSusjed, 0);
                            desniToken = true;
                        }

                        if (lijeviToken)
                        {
                            ProsljediVilicu(comm, lijevaVilica, lijeviSusjed);
                        }

                        if (desniToken)
                        {
                            ProsljediVilicu(comm, desnaVilica, desniSusjed);
                        }

                        System.Threading.Thread.Sleep(1000);
                    }

                    //Gladan
                    Console.WriteLine(pomak + "Gladan");
                    while (true)
                    {
                        //Provjeri jel netko nesto treba
                        porukaLijevogSusjeda = ProvjeriPorukeSusjeda(comm, lijeviSusjed);
                        porukaDesnogSusjeda  = ProvjeriPorukeSusjeda(comm, desniSusjed);
                        if (porukaLijevogSusjeda)
                        {
                            comm.Receive <bool>(lijeviSusjed, 0);
                            lijeviToken = true;
                        }
                        if (porukaDesnogSusjeda)
                        {
                            comm.Receive <bool>(desniSusjed, 0);
                            desniToken = true;
                        }
                        if (lijeviToken)
                        {
                            ProsljediVilicu(comm, lijevaVilica, lijeviSusjed);
                        }

                        if (desniToken)
                        {
                            ProsljediVilicu(comm, desnaVilica, desniSusjed);
                        }

                        //Provjerava ima li vilice za jelo
                        if (lijevaVilica.ImamVilicu && desnaVilica.ImamVilicu)
                        {
                            break;
                        }
                        else
                        {
                            if (!lijevaVilica.ImamVilicu)
                            {
                                if (comm.ImmediateProbe(lijeviSusjed, 1) != null)
                                {
                                    Console.WriteLine(pomak + "Dobivam vilicu od " + lijeviSusjed);
                                    comm.Receive <bool>(lijeviSusjed, 1);
                                    lijevaVilica.ImamVilicu = true;
                                    lijevaVilica.Stanje     = StanjeVilice.cista;
                                }
                            }
                            if (!lijevaVilica.ImamVilicu)
                            {
                                if (lijeviToken)
                                {
                                    comm.Send(true, lijeviSusjed, 0);
                                    Console.WriteLine(pomak + "Trazim vilicu od " + lijeviSusjed);
                                    lijeviToken = false;
                                }
                            }

                            if (!desnaVilica.ImamVilicu)
                            {
                                if (comm.ImmediateProbe(desniSusjed, 1) != null)
                                {
                                    Console.WriteLine(pomak + "Dobivam vilicu od " + desniSusjed);
                                    comm.Receive <bool>(desniSusjed, 1);
                                    desnaVilica.ImamVilicu = true;
                                    desnaVilica.Stanje     = StanjeVilice.cista;
                                }
                            }
                            if (!desnaVilica.ImamVilicu)
                            {
                                if (desniToken)
                                {
                                    comm.Send(true, desniSusjed, 0);
                                    Console.WriteLine(pomak + "Trazim vilicu od " + desniSusjed);
                                    desniToken = false;
                                }
                            }
                        }
                    }

                    //Jedi
                    Console.WriteLine(pomak + "Jedem ");
                    lijevaVilica.Stanje = StanjeVilice.prljava;
                    desnaVilica.Stanje  = StanjeVilice.prljava;

                    rand = new Random();
                    int eatingTime = rand.Next(2500, 5000);
                    System.Threading.Thread.Sleep(eatingTime);

                    //Provjeri treba li netko vilicu
                    porukaLijevogSusjeda = ProvjeriPorukeSusjeda(comm, lijeviSusjed);
                    porukaDesnogSusjeda  = ProvjeriPorukeSusjeda(comm, desniSusjed);
                    if (porukaLijevogSusjeda)
                    {
                        comm.Receive <bool>(lijeviSusjed, 0);
                        lijeviToken = true;
                    }
                    if (porukaDesnogSusjeda)
                    {
                        comm.Receive <bool>(desniSusjed, 0);
                        desniToken = true;
                    }

                    if (lijeviToken)
                    {
                        ProsljediVilicu(comm, lijevaVilica, lijeviSusjed);
                    }

                    if (desniToken)
                    {
                        ProsljediVilicu(comm, desnaVilica, desniSusjed);
                    }
                }
            }
        }
示例#8
0
        static void Main(string[] args)
        {
            using (new MPI.Environment(ref args))
            {
                Intracommunicator comm = Communicator.world;
                bool leftRequest       = false;
                bool rightRequest      = false;
                int  Id = comm.Rank;
                indentation = new String(' ', Id * 20);
                int    N_OF_SLEEPING = 5;
                int    MAX_SLEEPING  = 500;
                int    EATING_TIME   = 4000;
                Random random        = new Random();
                int    nOfPhilo      = comm.Size;
                int    LeftId        = (Id - 1);
                if (LeftId < 0)
                {
                    LeftId = nOfPhilo - 1;
                }
                int  rightId   = (Id + 1) % nOfPhilo;
                Fork leftFork  = null;
                Fork rightFork = null;
                if (Id == 0)
                {
                    leftFork  = new Fork(false, true);
                    rightFork = new Fork(false, true);
                }
                else if (Id == nOfPhilo - 1)
                {
                    leftFork  = new Fork(false, false);
                    rightFork = new Fork(false, false);
                }
                else
                {
                    leftFork  = new Fork(false, false);
                    rightFork = new Fork(false, true);
                }

                while (true)
                {
                    Console.WriteLine(indentation + "Mislim " + Id);
                    for (int i = 0; i < N_OF_SLEEPING; i++)
                    {
                        if (comm.ImmediateProbe(LeftId, 0) != null)
                        {
                            comm.Receive <Message>(LeftId, 0);
                            Console.WriteLine(indentation + "Saljem vilicu " + LeftId);
                            comm.Send <Message>(new Message(Id, FORK_RESPONSE), LeftId, 0);
                            leftFork.HasFork = false;
                            leftFork.IsClean = true;
                        }
                        if (comm.ImmediateProbe(rightId, 0) != null)
                        {
                            comm.Receive <Message>(rightId, 0);
                            Console.WriteLine(indentation + "Saljem vilicu " + rightId);
                            comm.Send <Message>(new Message(Id, FORK_RESPONSE), rightId, 0);
                            rightFork.HasFork = false;
                            rightFork.IsClean = true;
                        }
                        System.Threading.Thread.Sleep(random.Next(MAX_SLEEPING));
                    }
                    Console.WriteLine(indentation + "Gladan " + Id);
                    while (!(leftFork.HasFork && rightFork.HasFork))
                    {
                        Fork wanted = null;
                        int  neighbourId;
                        for (int i = 0; i < 2; i++)
                        {
                            wanted      = i == 0 ? leftFork : rightFork;
                            neighbourId = i == 0 ? LeftId : rightId;
                            if (!wanted.HasFork)
                            {
                                Console.WriteLine(indentation + "Trazim vilicu " + neighbourId);
                                Message message = new Message(Id, 0);
                                comm.Send <Message>(message, neighbourId, 0);
                            }
                            else
                            {
                                continue;
                            }
                            while (!wanted.HasFork)
                            {
                                Message message = comm.Receive <Message>(MPI.Unsafe.MPI_ANY_SOURCE, 0);
                                if (message.MessageType == FORK_RESPONSE)
                                {
                                    if (message.SourceId == LeftId)
                                    {
                                        leftFork.HasFork = true;
                                        leftFork.IsClean = true;
                                        leftRequest      = false;
                                        Console.WriteLine(indentation + "Primam vilicu " + LeftId);
                                    }
                                    else
                                    {
                                        rightFork.HasFork = true;
                                        rightFork.IsClean = true;
                                        rightRequest      = false;
                                        Console.WriteLine(indentation + "Primam vilicu " + rightId);
                                    }
                                }
                                else
                                {
                                    if (message.SourceId == LeftId)
                                    {
                                        leftRequest = parseRequest(comm, leftFork, true, LeftId, Id);
                                    }
                                    else
                                    {
                                        rightRequest = parseRequest(comm, rightFork, false, rightId, Id);
                                    }
                                }
                            }
                        }
                    }

                    Console.WriteLine(indentation + "Jedem " + Id);
                    leftFork.IsClean  = false;
                    rightFork.IsClean = false;
                    System.Threading.Thread.Sleep(random.Next(EATING_TIME));

                    if (leftRequest)
                    {
                        Console.WriteLine(indentation + "Saljem vilicu " + LeftId);
                        comm.Send <Message>(new Message(Id, FORK_RESPONSE), LeftId, 0);
                        leftRequest      = false;
                        leftFork.HasFork = false;
                        leftFork.IsClean = true;
                    }
                    if (rightRequest)
                    {
                        Console.WriteLine(indentation + "Saljem vilicu " + rightId);
                        comm.Send <Message>(new Message(Id, FORK_RESPONSE), rightId, 0);
                        rightRequest      = false;
                        rightFork.HasFork = false;
                        rightFork.IsClean = true;
                    }
                }


                //                misli(slucajan broj sekundi) ˇ ∧ odgovaraj na zahtjeve // asinkrono, s povremenom
                //provjerom
                //                while ¬imam obje vilice do
                //                    pošalji zahtjev za vilicom
                //                while ¬imam trazenu vilicu do
                //                    cekaj bilo koju poruku ˇ
                //                if poruka odgovor na zahtjev then
                //                ažuriraj vilice // dobio vilicu
                //                end if
                //                if poruka zahtjev then
                //                obradi zahtjev(odobri ili zabilježi) // drugi traže moju vilicu
                //                end if
                //                end while
                //                end while
                //                jedi
                //                odgovori na postojece zahtjeve // ako ih je bilo
            }
        }