Zakodziłem program, jednak nie wiem czy chodzi poprawnie i spełnia wszystkie warunki, moze ktos mi sprawdzic?
skorzystałem z pół statycznych typu bool, które reprezentują widelce.
ALGORYTM:
1. Wylosuj stronę z której weźmiesz widelec.
2. Poczekaj 2 sec, jak widelec jest wolny to go podnieś.
3a. Sprawdz czy drugi widelec jest wolny, jeżeli jest to go podnieś.
3b. Jeżeli jest zajęty to odłóż pierwszy widelec i zacznij od nowa.
4. Jak masz 2 widelce w ręku to zjedz i odłóż oba.
KOD:
Kod :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace fil
{
class Program
{
static void Main(string[] args)
{
FilozofClassThread filozofClass0 = new FilozofClassThread(0);
FilozofClassThread filozofClass1 = new FilozofClassThread(1);
FilozofClassThread filozofClass2 = new FilozofClassThread(2);
FilozofClassThread filozofClass3 = new FilozofClassThread(3);
FilozofClassThread filozofClass4 = new FilozofClassThread(4);
Thread filozof0 = new Thread(new ThreadStart(filozofClass0.Run));
Thread filozof1 = new Thread(new ThreadStart(filozofClass1.Run));
Thread filozof2 = new Thread(new ThreadStart(filozofClass2.Run));
Thread filozof3 = new Thread(new ThreadStart(filozofClass3.Run));
Thread filozof4 = new Thread(new ThreadStart(filozofClass4.Run));
filozof0.Start();
filozof1.Start();
filozof2.Start();
filozof3.Start();
filozof4.Start();
Console.ReadKey();
}
}
class FilozofClassThread
{
static volatile bool[] widelce = new bool[5] { false, false, false, false, false };
int numer;
int widelec;
int drugi_widelec;
int wykonanie;
public FilozofClassThread(int numer)
{
this.numer = numer;
wykonanie = 0;
}
public void Run()
{
Console.WriteLine("Filozof numer {0} losuje strone", numer);
Label:
do
{
if (wykonanie > 0)
widelce[widelec] = false;
wykonanie++;
Random gen = new Random(Guid.NewGuid().GetHashCode());
int strona = gen.Next(0, 2);
switch (strona)
{
case 0:
widelec = modulo(numer - 1, 5);
Console.WriteLine("Filozof numer {0}, wylosowal widelec numer {1}", numer, widelec);
Thread.Sleep(2000);
if (!widelce[widelec])
widelce[widelec] = true;
else
goto Label;
drugi_widelec = modulo(numer + 1, 5);
break;
case 1:
widelec = modulo(numer + 1, 5);
Console.WriteLine("Filozof numer {0}, wylosowal widelec numer {1}", numer, widelec);
Thread.Sleep(2000);
if (!widelce[widelec])
widelce[widelec] = true;
else
goto Label;
drugi_widelec = modulo(numer - 1, 5);
break;
}
} while (widelce[drugi_widelec]);
jedz(numer);
}
int modulo(int a, int b)
{
return a < 0 ? a + b : a % b;
}
void jedz(int numer)
{
widelce[widelec] = false;
widelce[drugi_widelec] = false;
Console.WriteLine("Filozof numer {0} zjadl spaghetti... uzywajac widelca {1} i {2}",numer,widelec, drugi_widelec);
}
}
}
Zakładki