I have to thank Tom Missaar for he is my HSP. You can select any item from the menu that suits your needs.
This is not a commercial site. So all the information is for free. Please inform me when anything is usefull to you.
Dit is een mogelijke oplossing voor het probleem met de dinerende filosofen maar zeker niet de enige.
Het concept van de filosofen is als volgd: Een aantal filosofen zit voor eeuwig aan een ronde tafel. In het midden van de tafel staat een kom met rijst Tussen elke twee filosofen ligt een gedeelde chopstick (shared resource). Elke filosoof spendeerd zijn of haar leven alleen aan eten en denken. Als een filosoof honger heeft, dan moet hij of zij exclusief toegang hebben tot bijde chopsticks alvorens te kunnen eten. We zoeken dus naar een methode die de nodige syncronisatie en de efficientie leverd (efficency), en er voor zorgt dat er geen deadlock onstaat en geen geen gedwongen wachten (fairness), ofwel de filosoof moet geen honger krijgen en mag ook niet uitsterven.
Een monitor wordt gebruikt om de toegang tot staat variable en conditie variabele te reguleren. De eetstokjes alsmede de rijst zijn geen onderdeel van de monitor. Als ze dat wel zouden zijn dan was het volledige eten een monitor procedure en alleen een filosoof zou per keer eten. Monitor procedures zijn gedefineerd voor het verkrijgen van de sticks en het neerleggen ervan. Deze worden gebruikt als start en eind protocollen voor de programma segmenten welke werkelijk de sticks gebruiken (dit vindt meestal plaats buiten de monitor).
Het nummer van de filosofen is gegeven in NUM_PHILS. Elke filosoof kan in een van de volgende stadia verkeren DENKEN,HONGERIG of ETEN. Voor elke filosoof is er een conditie variabele waarop de filosoof wacht als hij of zij hongerig is en een of meer eetstokjes in gebruik zijn.
Een filosoof die wil eten controlleerd de staat van zijn twee buren en gaat verder als bijde niet aan het eten zijn. Anders wacht de filosoof. Een filosoof die klaar is met eten geeft elke buur een kans om te eten, als ze honger hebben en de stokjes vrij zijn.
DATA: INITIALIZATION: MONITOR PROCEDURES:Een oplossing voor de Dinerende Filosoof
MONITOR:
condition can_eat[NUM_PHILS]; enum states {THINKING, HUNGRY, EATING} state[NUM_PHILS-1]; int index;
for (index=0; index<NUM_PHILS; index++) {
flags[index] = THINKING;
}
/* request the right to pickup chopsticks and eat */
entry void pickup(int mynum) {
/* announce that we're hungry */
state[mynum] = HUNGRY;
/* if neighbor's aren't eating, proceed */
if ((state[mynum-1 mod NUM_PHILS] != EATING) &&
(state [mynum+1 mod NUM_PHILS] != EATING)) {
state[mynum] = EATING;
}
/* otherwise wait for them */
else can_eat[mynum].wait;
/* ready to eat now */
state[mynum] = EATING;
}
/* announce that we're finished, give others a chance */
entry void putdown(int mynum) {
/* announce that we're done */
state[mynum] = THINKING;
/* give left (lower) neighbor a chance to eat */
if ((state [mynum-1 mod NUM_PHILS] == HUNGRY) &&
(state [mynum-2 mod NUM_PHILS] != EATING)) {
can_eat[mynum-1 mod NUM_PHILS].signal;
}
/* give right (higher) neighbor a chance to eat */
if ((state [mynum+1 mod NUM_PHILS] == HUNGRY) &&
(state [mynum+2 mod NUM_PHILS] != EATING)) {
can_eat[mynum+1 mod NUM_PHILS].signal;
}
}
PHILOSOPHER:
/* find out our id, then repeat forever */
me = get_my_id();
while (TRUE) {
/* think, wait, eat, do it all again ... */
think();
pickup(me);
eat();
putdown(me);
}
Commentaar:
Serjan Pruis (10.25.05 / 9:15pm)
Het is mogelijk commentaar te geven op deze site. Je kunt dus b.v. eigen tips geven of ander oplossingen geven.