]> git.llucax.com Git - z.facultad/75.59/filosofos.git/blobdiff - src/filosofos.py
me copio de gaz
[z.facultad/75.59/filosofos.git] / src / filosofos.py
index 27c969063941b4030ab443ec80ae3e3e0275abf3..6d70e4dd277cc2e78bbba6db2a614beeea1c3844 100644 (file)
@@ -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]) + "<Cantidad de chinos invitados a la fiesta> <Cantidad de rondas que estara pensando o comiendo cada chino>"
-               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])))