[JAVA]Algorytm Dekkera - złe wyniki


(Duzy Rysiek) #1

Witam. mam problem z algorytmem Dekkera ponieważ wypisuje mi błędne rozwiązanie:

Proces P1 jest po za sekcją krytyczną

Proces P2 jest po za sekcją krytyczną

Proces P1 chce wejść do sekcji krytycznej

Proces P1 jest w sekcji krytycznej

----------------------------------

Proces P2 chce wejść do sekcji krytycznej

Proces P2 jest w sekcji krytycznej

----------------------------------

Proces P1 jest po za sekcją krytyczną

Proces P2 jest po za sekcją krytyczną

Proces P1 chce wejść do sekcji krytycznej

Proces P1 jest w sekcji krytycznej

----------------------------------

Proces P2 chce wejść do sekcji krytycznej

Proces P2 jest w sekcji krytycznej

----------------------------------

Proces P1 jest po za sekcją krytyczną

Proces P2 jest po za sekcją krytyczną

Proces P1 chce wejść do sekcji krytycznej

Proces P1 jest w sekcji krytycznej

----------------------------------

Proces P2 chce wejść do sekcji krytycznej

Proces P2 jest w sekcji krytycznej

----------------------------------

jak wiadomo nie mogą być dwa procesy w sekcji krytycznej :frowning: poniżej podaje kod

public class Dekker extends Thread{


    private String name;

    private static int favoreprocess=1;

    private volatile boolean p1=false, p2=false;


    public Dekker(String name){

        this.name=name;

    }


    @Override

    public void run(){

        try {

            if (name.equals("X")) {

                Thread.sleep(10);

            } else if (name.equals("Y")) {

                Thread.sleep(20);

            }


            if (name.equals("X")) 

            {

                while (true) 

                {

                	System.out.println("Proces P1 jest po za sekcją krytyczną");

                    sleep (1000);

                    System.out.println("Proces P1 chce wejść do sekcji krytycznej");

                    p1 = true;

                    while (p2) 

                        if (favoreprocess == 2) 

                        {

                            p1 = false;

                            while (favoreprocess == 2);

                                p1 = true;

                        }

                    System.out.println("Proces P1 jest w sekcji krytycznej");

                    System.out.println("----------------------------------");

                    sleep (1000);


                    favoreprocess = 2;

                    p1 = false;

                }

            }


            else if (name.equals("Y")) 

            {

                while (true) 

                {

                	System.out.println("Proces P2 jest po za sekcją krytyczną");

                    sleep (1000);

                    System.out.println("Proces P2 chce wejść do sekcji krytycznej");

                    p2 = true;

                    while (p1) 

                        if (favoreprocess == 1) 

                        {

                            p2 = false;

                            while (favoreprocess == 1); 

                            p2 = true;

                         }

                    System.out.println("Proces P2 jest w sekcji krytycznej");

                    System.out.println("----------------------------------");

                    sleep (1000);


                    favoreprocess = 1;

                    p2 = false;

                }

            }


        } catch (InterruptedException ex) {}

    }

}

bardzo proszę o szybką pomoc. program mam na jutro :o


(kostek135) #2

Możesz pokazać jak uruchamiasz program w main? Od razu uprzedzę, że jeśli tworzysz dwie instancje w/w klasy, to nie ma prawa działać, bo zmienne nie są współdzielone.


(Duzy Rysiek) #3
public class Algorytm_Dekkera {


    public static void main(String[] args){

        Dekker proces1 = new Dekker("X");

        Dekker proces2 = new Dekker("Y");

        proces1.start();

        proces2.start();


    }

}

w razie błędu proszę o poprawę


(kostek135) #4

Tak jak napisałem - ale to twój program, więc poprawisz go sam. Tworzysz dwa obiekty klasy Dekker. Przez co w pamięci wydzielane są dwa odseparowane bloki zmiennych wyspecyfikowane jako pola. Musisz sprawić, aby te zmienne były wspólne.


(Duzy Rysiek) #5

dzięki wielkie :wink: wszystko już działa :wink:

Proces P1 jest po za sekcją krytyczną

Proces P2 jest po za sekcją krytyczną

Proces P1 chce wejść do sekcji krytycznej

Proces P1 jest w sekcji krytycznej

Watek Proces1:1

Proces P1 wyszedł z sekcji krytycznej


Proces P2 chce wejść do sekcji krytycznej

Proces P2 jest w sekcji krytycznej

Watek Proces2:2

Proces P2 wyszedł z sekcji krytycznej


Proces P1 jest po za sekcją krytyczną

Proces P2 jest po za sekcją krytyczną

Proces P1 chce wejść do sekcji krytycznej

Proces P1 jest w sekcji krytycznej

Watek Proces1:3

Proces P1 wyszedł z sekcji krytycznej