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 :(
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) {}
}
}
główna klasa
public class Algorytm_Dekkera {
public static void main(String[] args){
Dekker proces1 = new Dekker("X");
Dekker proces2 = new Dekker("Y");
proces1.start();
proces2.start();
}
}
bardzo proszę o szybką pomoc. program mam na jutro :o