X-Git-Url: https://git.llucax.com/z.facultad/75.59/filosofos.git/blobdiff_plain/416feeaa1aae8115b27365646eecd94a7da013d4..6837ea0adc558be8d6f0be164655f9d348a87483:/src/filosofos.py?ds=inline 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])))