From d4b0e953509869f6716ff15cc4a50eea909f367f Mon Sep 17 00:00:00 2001 From: tailor Date: Tue, 29 Nov 2005 03:13:06 +0000 Subject: [PATCH] dejo la version con locks vieja pero agrego la bis que anda bien porque la otra era una basofia version que anda --- src/filosofos.py | 68 +++++++++++++++++++-------------- src/filosofos_bis.py | 91 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+), 29 deletions(-) create mode 100644 src/filosofos_bis.py diff --git a/src/filosofos.py b/src/filosofos.py index db239ef..6d70e4d 100644 --- a/src/filosofos.py +++ b/src/filosofos.py @@ -8,12 +8,24 @@ from sync import * palitos = [] semaforos = [] +todoscomieron = 0 +class monitor(threading.Thread): + def __init__(self, cant): + threading.Thread.__init__(self) + self.cant = cant + self.start() + def run(self): + global todoscomieron + while todoscomieron < self.cant: + print 'palitos = ', palitos + time.sleep(1) class filosofo(threading.Thread): - def __init__(self, numeracion, cant): + def __init__(self, izq, der, cant): threading.Thread.__init__(self) - self.id = numeracion + self.id = self.izq = izq + self.der = der self.rnd = random.Random() self.cant = cant # cantidad de veces que va a comer self.comi = 0 # cantidad de veces que comio @@ -21,37 +33,34 @@ class filosofo(threading.Thread): self.izquierdo = False self.start() - @synchronized('Lock') + @synchronized('LockTomarDerecho') def agarrarPalitoDerecho(self): - if self.id+1 == len(palitos): ind = 0 - else: ind = self.id+1 - self.derecho = palitos[ind] + self.derecho = palitos[self.der] if self.derecho: - palitos[ind] = False + palitos[self.der] = False print 'Soy '+str(self.id)+' y agarre el palito derecho' return True else: self.derecho = False + palitos[self.der] = True return False - @synchronized('Lock') + @synchronized('LockSoltarDerecho') def dejarPalitoDerecho(self): - if self.id+1 == len(palitos): ind = 0 - else: ind = self.id+1 self.derecho = False - palitos[ind] = True - if self.derecho: - print 'Soy '+str(self.id)+' y solte el palito derecho' + palitos[self.der] = True + print 'Soy '+str(self.id)+' y solte el palito derecho' - @synchronized('Lock') + @synchronized('LockIzquierdo') def agarrarPalitoIzquierdo(self): - self.izquierdo = palitos[self.id] + self.izquierdo = palitos[self.izq] if self.izquierdo: - palitos[self.id] = False + palitos[self.izq] = False print 'Soy '+str(self.id)+' y agarre el palito izquierdo' return True else: self.izquierdo = False + palitos[self.izq] = True return False def pensar(self): @@ -65,34 +74,35 @@ class filosofo(threading.Thread): print 'Soy '+str(self.id)+' y voy a comer durante '+str(t)+' segundos' self.comi = self.comi + 1 time.sleep(t) - if self.id+1 == len(palitos): ind = 0 - else: ind = self.id+1 self.derecho = self.izquierdo = False - palitos[self.id] = True - palitos[ind] = True + palitos[self.izq] = True + palitos[self.der] = True print 'Soy '+str(self.id)+' y solte los palitos' - return True - else: return False def lleno(self): - if self.cant == self.comi: return True + global todoscomieron + if self.cant == self.comi: + todoscomieron = todoscomieron + 1 + return True else: return False def run(self): while not self.lleno(): + self.pensar() if self.agarrarPalitoDerecho(): self.agarrarPalitoIzquierdo() - else: self.dejarPalitoDerecho() - if not self.comer(): - self.pensar() - + else: + self.dejarPalitoDerecho() + self.comer() + if __name__ == '__main__': if len(sys.argv) < 3: print "Modo de uso: "+ str(sys.argv[0]) + " " sys.exit() - + +# mo = monitor(int(sys.argv[1])) chinos = [] for i in range(int(sys.argv[1])): palitos.append(True) - chinos.append(filosofo(i,int(sys.argv[2]))) + chinos.append(filosofo(i,(i+1)%int(sys.argv[1]),int(sys.argv[2]))) diff --git a/src/filosofos_bis.py b/src/filosofos_bis.py new file mode 100644 index 0000000..a1c8757 --- /dev/null +++ b/src/filosofos_bis.py @@ -0,0 +1,91 @@ +#! /usr/bin/env python2.4 +import threading +import sys +import random +import time +from sync import * + +palitos = [] #vector con los palitos + +class palito: + def __init__(self, id): + self.id = id + self.libre = True + + @synchronized('dejar') + def dejar(self): + self.libre = True + + @synchronized('libre') + def free(self): + return self.libre + + @synchronized('tomar') + def tomar(self): + self.libre = False + + +class filosofo(threading.Thread): + def __init__(self, izq, der, cant): + threading.Thread.__init__(self) + self.id = self.izq = izq + self.der = der + self.izq = izq + self.rnd = random.Random() + self.cant = cant # cantidad de veces que va a comer + self.comi = 0 # cantidad de veces que comio + self.derecha = False # indica si tengo el palito derecho + self.izquierda = False # indica si tengo el palito izquierdo + self.start() + + def pensar(self): + t = self.rnd.randint(1,5) + print 'Soy '+str(self.id)+' y voy a pensar durante '+str(t)+' segundos' + time.sleep(t) + + def comer(self): + t = self.rnd.randint(1,5) + print 'Soy '+str(self.id)+' y voy a comer durante '+str(t)+' segundos' + self.comi = self.comi + 1 + time.sleep(t) + + def lleno(self): + if self.cant == self.comi: + return True + else: return False + + def run(self): + while not self.lleno(): + self.pensar() + if palitos[self.der].free(): + palitos[self.der].tomar() + self.derecha = True + print 'Soy '+str(self.id)+' y tome el palito derecho' + if palitos[self.izq].free(): + palitos[self.izq].tomar() + self.izquierda = True + print 'Soy '+str(self.id)+' y tome el palito izquierdo' + else: + palitos[self.der].dejar() + self.derecha = self.izquierda = False + print 'Soy '+str(self.id)+' y deje el palito derecho' + if self.derecha and self.izquierda: + self.comer() + palitos[self.der].dejar() + palitos[self.izq].dejar() + self.derecha = self.izquierda = False + print 'Soy '+str(self.id)+' y deje los palitos' + else: self.pensar() + +if __name__ == '__main__': + if len(sys.argv) < 3: + print "Modo de uso: "+ str(sys.argv[0]) + " " + sys.exit() + + chinos = [] + for i in range(int(sys.argv[1])): + palitos.append(palito(i)) + chinos.append(filosofo(i,(i+1)%int(sys.argv[1]),int(sys.argv[2]))) + + + -- 2.43.0