X-Git-Url: https://git.llucax.com/z.facultad/75.59/filosofos.git/blobdiff_plain/416feeaa1aae8115b27365646eecd94a7da013d4..a2ffc1a96fbb1033b3b39c85c672041f5fdd4cbe:/src/filosofos2.py diff --git a/src/filosofos2.py b/src/filosofos2.py index c86036c..37f2cd2 100644 --- a/src/filosofos2.py +++ b/src/filosofos2.py @@ -9,53 +9,58 @@ from sync import * palitos = [] semaforos = [] - class filosofo(threading.Thread): - def __init__(self, numeracion, cant): + def __init__(self, izq, der, cant): threading.Thread.__init__(self) - self.id = numeracion + self.id = izq self.rnd = random.Random() self.cant = cant # cantidad de veces que va a comer self.comi = 0 # cantidad de veces que comio - self.derecho = False - self.izquierdo = False + self.der = der + self.izq = izq + self.ambos = [False, False] self.start() def agarrarPalitoDerecho(self): - if self.id+1 == len(palitos): ind = 0 - else: ind = self.id+1 - semaforos[ind].acquire() - self.derecho = palitos[ind] - if self.derecho: - print 'Soy '+str(self.id)+' y agarre el palito derecho' - else: self.derecho = False + semaforos[self.der].acquire() + palitos[self.der] = False + self.ambos[1] = True + print 'Soy '+str(self.id)+' y agarre el palito derecho' def agarrarPalitoIzquierdo(self): - semaforos[self.id].acquire() - self.izquierdo = palitos[self.id] - if self.izquierdo: - print 'Soy '+str(self.id)+' y agarre el palito izquierdo' - else: self.izquierdo = False + semaforos[self.izq].acquire() + palitos[self.izq] = False + self.ambos[0] = True + print 'Soy '+str(self.id)+' y agarre el palito izquierdo' + + def dejarPalitoDerecho(self): + palitos[self.der] = True + semaforos[self.der].release() + self.ambos[1] = False + print 'Soy '+str(self.id)+' y solte el palito derecho' + + def dejarPalitoIzquierdo(self): + palitos[self.izq] = True + semaforos[self.izq].release() + self.ambos[0] = False + print 'Soy '+str(self.id)+' y solte el palito izquierdo' def pensar(self): - t = self.rnd.randint(1,5) + t = self.rnd.randint(2,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) - if self.derecho and self.izquierdo: + if self.ambos == [True, True]: print 'Soy '+str(self.id)+' y voy a comer '+str(t)+' segundos' self.comi = self.comi + 1 self.izquierdo = self.derecho = False time.sleep(t) - if self.id+1 == len(palitos): ind = 0 - else: ind = self.id+1 - palitos[self.id] = True - palitos[ind] = True - semaforos[self.id].release() - semaforos[ind].release() - print 'Soy '+str(self.id)+' y solte los palitos' + + self.dejarPalitoIzquierdo() + self.dejarPalitoDerecho() + return True else: return False @@ -64,21 +69,29 @@ class filosofo(threading.Thread): else: return False def run(self): - time.sleep(self.rnd.randint(1,5)) while not self.lleno(): + self.pensar() self.agarrarPalitoDerecho() self.agarrarPalitoIzquierdo() - if not self.comer(): - self.pensar() + self.comer() + +# while not self.lleno(): +# self.agarrarPalitoDerecho() +# self.agarrarPalitoIzquierdo() +# if not self.comer(): +# self.pensar() if __name__ == '__main__': if len(sys.argv) < 3: print "Modo de uso: "+ str(sys.argv[0]) + " " sys.exit() + if int(sys.argv[1]) <= 1: + print "Debe haber por lo menos 2 chinos" + sys.exit() chinos = [] - for i in range(int(sys.argv[1])): + todos = int(sys.argv[1]); + for i in range(todos): palitos.append(True) semaforos.append(threading.Semaphore(1)) - chinos.append(filosofo(i,int(sys.argv[2]))) - + chinos.append(filosofo(i,(i+1)%todos,int(sys.argv[2])))