//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); }
static private bool CheckForMessage(int neighbourId, Intracommunicator comm) { var check = comm.ImmediateProbe(neighbourId, 0); if (check != null) { return(true); } return(false); }
static private bool SaljeLiNetkoVilicu(Intracommunicator comm, int susjed) { var flag = comm.ImmediateProbe(susjed, 1); if (flag != null) { return(true); } return(false); }
static private bool ProvjeriPorukeSusjeda(Intracommunicator comm, int susjed) { var flag = comm.ImmediateProbe(susjed, 0); if (flag != null) { return(true); } return(false); }
static private bool ProvjeriPorukeSusjeda(Intracommunicator comm, int susjed) { if (comm.ImmediateProbe(susjed, 0) != null) { return(true); } else { return(false); } }
public bool ProbeMessage() { Status status = _comm.ImmediateProbe(Communicator.anySource, Communicator.anyTag); return(status != null); }
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); } } } }
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 } }