Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # esta es una versión fair de http://pastebin.com/ubHAuZ6h
- # el problema que tenía la solución anterior era que se podía dar el caso de que mi vecino izquierdo y mi vecino derecho # se alternaran y dejándome morir de hambre
- # la solución que se me ocurrio consiste en llevar la cuenta de las veces que comió cada uno y establecer un
- # límite de tolerancia L de manera tal que un filosofo nunca haya comido L veces más que sus vecinos.
- # habría que ver como se elige el valor de L. se me ocurre que cuanto más chico sea menos frecuentes van a ser esas
- # injusticias pero por otro lado se va a aprovechar menos el paralelismo.
- # de todas maneras, si L es grande y las injusticias esas son muy frecuentes, no quiere decir que no sea fair.
- # a fairness le alcanza con que eventualmente se ejecute (?)
- # lo bueno de passing de baton es que sólo tengo que cambiar las condiciones de los protocolos de entrada y salida
- # los filosofos pueden estar en tres estados: pensando, hambriento o comiendo
- enum state[N];
- sem s[N] = ([N] 0);
- int veces[N] = ([N] 0);
- sem e = 1;
- function left(i){
- return (i - 1) mod N;
- }
- function right(i){
- return (i + 1) mod N;
- }
- process Philosopher [i := 0 to N - 1] {
- while (true){
- state[i] = THINKING;
- pensarComoUnFilosofo();
- P(e);
- if (state[left(i)] == EATING state[right(i)] == EATING or
- veces[i] - veces[left(i)] >= L or veces[i] - veces[rigth(i)] >= L){
- state[i] = HUNGRY;
- V(e);
- P(s[i]);
- }
- state[i] = EATING;
- veces[i] += 1;
- V(e);
- comerComoUnCampeon();
- # a partir de acá viene el código de lo que vendría a ser el SIGNAL
- P(e);
- # me fijo si el tipo que tengo a la izquierda esta esperando mi tenedor
- if (state[left(i)] == HUNGRY and
- veces[i] - veces[left(left(i))] < L and
- state[left(left(i))] != EATING) {
- V(s[left(i)]);
- }
- # me fijo si el tipo que tengo a la derecha esta esperando mi tenedor
- elif (state[right(i)] == HUNGRY and
- veces[i] - veces[right(right(i))] < L and
- state[right(right(i))] != EATING) {
- V(s[right(i)]);
- }
- else {
- V(e);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment