]> git.llucax.com Git - z.facultad/75.59/filosofos.git/blobdiff - src/filosofos2.py
todavia no anda muy bien, pero ya lo voy a sacar andando..
[z.facultad/75.59/filosofos.git] / src / filosofos2.py
index c86036c229b628d67a1f97df7b923183e8d4b6a3..da6fa8b1b48d94d460eb8dd3b1b28ef300517c42 100644 (file)
@@ -9,52 +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()
+
+                       self.dejarPalitoIzquierdo()
+                       self.dejarPalitoDerecho()
+                       
                        print 'Soy '+str(self.id)+' y solte los palitos'
                        return True
                else: return False
@@ -64,7 +70,6 @@ class filosofo(threading.Thread):
                else: return False
                
        def run(self):
-               time.sleep(self.rnd.randint(1,5))
                while not self.lleno():
                        self.agarrarPalitoDerecho()
                        self.agarrarPalitoIzquierdo()
@@ -75,10 +80,13 @@ if __name__ == '__main__':
        if len(sys.argv) < 3:
                print "Modo de uso: "+ str(sys.argv[0]) + "<Cantidad de chinos invitados a la fiesta> <Cantidad de rondas que estara pensando o comiendo cada chino>"
                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])))