]> git.llucax.com Git - z.facultad/75.59/filosofos.git/blobdiff - src/filosofos.py
Pongo la espera en segundos para ser consistente.
[z.facultad/75.59/filosofos.git] / src / filosofos.py
index db239ef5603d6891f646b5ff376e548ca9034bf3..6d70e4dd277cc2e78bbba6db2a614beeea1c3844 100644 (file)
@@ -8,12 +8,24 @@ from sync import *
 
 palitos = []
 semaforos = []
 
 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):
 
 class filosofo(threading.Thread):
-       def __init__(self, numeracion, cant):
+       def __init__(self, izq, der, cant):
                threading.Thread.__init__(self)
                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
                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()
        
                self.izquierdo = False
                self.start()
        
-       @synchronized('Lock')
+       @synchronized('LockTomarDerecho')
        def agarrarPalitoDerecho(self):
        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:
                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
                        print 'Soy '+str(self.id)+' y agarre el palito derecho'
                        return True
                else:
                        self.derecho = False
+                       palitos[self.der] = True
                        return False
 
                        return False
 
-       @synchronized('Lock')
+       @synchronized('LockSoltarDerecho')
        def dejarPalitoDerecho(self):
        def dejarPalitoDerecho(self):
-               if self.id+1 == len(palitos): ind = 0
-               else: ind = self.id+1
                self.derecho = False
                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):
        def agarrarPalitoIzquierdo(self):
-               self.izquierdo = palitos[self.id]
+               self.izquierdo = palitos[self.izq]
                if self.izquierdo:
                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
                        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):
                        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)
                        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
                        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'
                        print 'Soy '+str(self.id)+' y solte los palitos'
-                       return True
-               else: return False
                
        def lleno(self):
                
        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():
                else: return False
                
        def run(self):
                while not self.lleno():
+                       self.pensar()
                        if self.agarrarPalitoDerecho():
                                self.agarrarPalitoIzquierdo()
                        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]) + "<Cantidad de chinos invitados a la fiesta> <Cantidad de rondas que estara pensando o comiendo cada chino>"
                sys.exit()
 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()
-       
+               
+#      mo = monitor(int(sys.argv[1]))
        chinos = []
        for i in range(int(sys.argv[1])):
                palitos.append(True)
        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])))