X-Git-Url: https://git.llucax.com/z.facultad/75.59/filosofos.git/blobdiff_plain/02cb968f91d2111edf17eb4920b037f386dccd33..2b3101e9328c0fa1e196fcf460f8aff0fda34353:/src/filosofos.py diff --git a/src/filosofos.py b/src/filosofos.py index 27c9690..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,60 +33,76 @@ 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[self.der] = False print 'Soy '+str(self.id)+' y agarre el palito derecho' - else: self.derecho = False - - @synchronized('Lock') + return True + else: + self.derecho = False + palitos[self.der] = True + return False + + @synchronized('LockSoltarDerecho') + def dejarPalitoDerecho(self): + self.derecho = False + palitos[self.der] = True + print 'Soy '+str(self.id)+' y solte el palito derecho' + + @synchronized('LockIzquierdo') def agarrarPalitoIzquierdo(self): - self.izquierdo = palitos[self.id] + self.izquierdo = palitos[self.izq] if self.izquierdo: + palitos[self.izq] = False print 'Soy '+str(self.id)+' y agarre el palito izquierdo' - else: self.izquierdo = False + return True + else: + self.izquierdo = False + palitos[self.izq] = True + return False def pensar(self): - t = self.rnd.randint(0,5) + 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): if self.derecho and self.izquierdo: - print 'Soy '+str(self.id)+' y voy a comer' + t = self.rnd.randint(1,5) + print 'Soy '+str(self.id)+' y voy a comer durante '+str(t)+' segundos' self.comi = self.comi + 1 - self.izquierdo = self.derecho = False - time.sleep(self.rnd.randint(0,5)) - if self.id+1 == len(palitos): ind = 0 - else: ind = self.id+1 - palitos[self.id] = True - palitos[ind] = True - 'Soy '+str(self.id)+' y solte los palitos' - return True - else: return False + time.sleep(t) + self.derecho = self.izquierdo = False + palitos[self.izq] = True + palitos[self.der] = True + print 'Soy '+str(self.id)+' y solte los palitos' 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.agarrarPalitoDerecho() - self.agarrarPalitoIzquierdo() - if not self.comer(): - self.pensar() - else: time.sleep(5) #comiendo - + self.pensar() + if self.agarrarPalitoDerecho(): + self.agarrarPalitoIzquierdo() + else: + self.dejarPalitoDerecho() + self.comer() + if __name__ == '__main__': if len(sys.argv) < 3: print "Modo de uso: "+ str(sys.argv[0]) + " " - exit - + 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])))