Avatar billede ferrari_brian Nybegynder
18. november 2003 - 00:24 Der er 2 kommentarer og
1 løsning

dining philosophers problem

nogen der lige har nogle gode links eller en god forklaring/løsning på: dining philosophers problem ???

haster lidt... for jeg har bare ikke kunnet finde noget ordentligt !!
Avatar billede shodo Nybegynder
18. november 2003 - 01:09 #1
Hvis du må bruge Semaphore til at løse problemet med så er en af de klassiske løsninger:

semaphore fork[5] = {1, 1, 1, 1, 1};  //definere en semaphore for hver gaffel (fork)

process Philosopher[i = 0 to 3] {
  while (true) {
    P(fork[i]); P(fork[i+1]); //tag den venstre gaffel så den højre
    eat();
    V(fork[i]); V(fork[i+1]);  //frigiv gaflerne igen
    think();
  }
}
process Philosopher[4] {
  while (true) {
    P(fork[0]); P(fork[4]); //tag den højre gaffel så den venstre
    eat();
    V(fork[i]); V(fork[i+1]);  //frigiv gaflerne igen
    think();
  }
}

Denne løsning undgår at der opstår et circular wait dvs. en deadlock, ved at lade den sidst philosopher samle sine gafler op i modsat rækkefølge. En alternativ løsning ville være at lade hver anden samle gaflerne op i modsat række følge. Der findes også løsninger der er baserede på monitore, i stedet for semaphore, men de bliver noget mere komplekse, og dem kan jeg ikke huske i hovedet...
Jeg har desværre ikke rigtig nogen gode link på nettet, men jeg bruger selv Foundations of Multithreaded, Parallel, and Distributed Programming som er rimelig fornuftig bog om parallel programering. Den er skrevet af Gregory R. Andrews

Venlig hilsen
Lars
Avatar billede ferrari_brian Nybegynder
18. november 2003 - 11:19 #2
mange tak... tror bare jeg bruger dette ... (er bare til en fremlæggelse... ikke noget som jeg skal programmere... (vil dog gerne have andre svar hvis det er muligt... skal bruge det senere... men tak)
Avatar billede shodo Nybegynder
18. november 2003 - 16:12 #3
Et andet alternativ er at bruge monitorer (f.eks. understøtter Java ikke brugen af semaphore), men det er realt set den samme løsning. Idet man konstruere en semaphore vha. monitorer, for så der efter at bruger man ovenstående løsning.

En semaphore i Java kunne f.eks. være flg.

public class Semaphore {

    private int s = 0;

    public Semaphore(int s0) {
    if (s0 >= 0)
        s = s0;
    else
        throw new Error("Semaphore initialized to negative value: " + s0);
    }

    public synchronized void P()
    throws InterruptedException {
    while (s == 0) wait();
    s--;
    }

    public synchronized void V() {
    s++;
    notify();
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester