[c#] symchronizacja przy problemie palaczy.

0

Muszę rozwiązać problem palaczy. Ogólnie polega na tym że mamy sędziego który daje palaczem półprodukty i 3 palaczy którzy skręcają z tego papierosy i palą. Potrzebujemy 4 wątków (1 sedzia i 3 palaczy) niestety nie wiem jak to zrobić żeby sędzia budził wątki palaczy (w tym czasie sam zasypia) następnie jeden z palaczy skręca i pali po czym budzi sędziego (i zasypia). Mógłby ktoś mi podpowiedzieć jak to zrobić (oczywiście znam funkcje resume i suspend)?

0

Interrupt?

Albo inaczej: sędzia czeka aż palacz skończy, czyli Join.

0
class Palacz
    {
        int c;
        Thread arbiter;
        public Palacz(int stu, Thread a)
        {
            c = stu;
            arbiter = a;
        }

        public void pal(){
        while(true){
            if(c+Stolik.a+Stolik.b==3){
                Console.WriteLine("palacz "+c+"pali papierosa");
                Stolik.a=Stolik.b=3;
                arbiter.Resume();
            }
        //Tu chciałbym żeby zasną.
        }
    }

    }

class Agent
    {
        public static void rzuc()
        {
            while (true)
            {
                //int i = 0;
                while (true)
                {
                    //i++;
                    int x = 3;
                    int y = 3;
                    Random generator = new Random();
                    x = generator.Next(-1, 3);
                    y = generator.Next(-1, 3);
                    while (x == y)
                    {
                        x = generator.Next(-1, 3);
                    }
                    Stolik.a = x; Stolik.b = y;

                }
            }
        }
    }

Udało mi się napisać taki kod tylko nie wiem jak usypiać arbitra i wszystkich palaczy.

Program do testowania wygląda tak:

public static void Main(String[] args)
        {
            //Agent s = new Agent();
            Thread sedzia = new Thread(Agent.rzuc);
            sedzia.Start();
            //clientThread.Start(client);

            Palacz palacz1 = new Palacz(0, sedzia);
            Palacz palacz2 = new Palacz(1, sedzia);
            Palacz palacz3 = new Palacz(2, sedzia);

            Thread pal1 = new Thread(palacz1.pal);
            Thread pal2 = new Thread(palacz2.pal);
            Thread pal3 = new Thread(palacz3.pal);

            pal1.Start();
            pal2.Start();
            pal3.Start();

        }
0

Chciałbym wymusić zaśnięcie wątków palaczy i sędziego mógłby ktoś podpowiedzieć jak to wykonać?

<sorry za double'a>

0

Ja proponuje zapisać to w formie prostego algorytmu bez wątków (zauważ, że i tak zawsze aktywny byłby tylko 1):

pętla(sędzia) + 3 funkcje(palacze)

Rozwiązanie prostsze i wydajniejsze (nie trzeba marnować czasu procesora na synchronizację wątków)

0

No tak tylko że chciałbym się dowiedzieć jak to się robi na wątkach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1