]> git.llucax.com Git - z.facultad/75.59/filosofos.git/commitdiff
dejo la version con locks vieja pero agrego la bis que anda bien porque la otra
authortailor <sagardua@uolsinectis.com.ar>
Tue, 29 Nov 2005 03:13:06 +0000 (03:13 +0000)
committertailor <sagardua@uolsinectis.com.ar>
Tue, 29 Nov 2005 03:13:06 +0000 (03:13 +0000)
era una basofia

version que anda

src/filosofos.py
src/filosofos_bis.py [new file with mode: 0644]

index db239ef5603d6891f646b5ff376e548ca9034bf3..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,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]) + "<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.append(filosofo(i,int(sys.argv[2])))
+               chinos.append(filosofo(i,(i+1)%int(sys.argv[1]),int(sys.argv[2])))
 
diff --git a/src/filosofos_bis.py b/src/filosofos_bis.py
new file mode 100644 (file)
index 0000000..a1c8757
--- /dev/null
@@ -0,0 +1,91 @@
+#! /usr/bin/env python2.4
+import threading
+import sys
+import random
+import time
+from sync import *
+
+palitos = [] #vector con los palitos
+
+class palito:
+       def __init__(self, id):
+               self.id = id
+               self.libre = True
+       
+       @synchronized('dejar')
+       def dejar(self):
+               self.libre = True
+       
+       @synchronized('libre')
+       def free(self):
+               return self.libre
+
+       @synchronized('tomar')
+       def tomar(self):
+               self.libre = False
+
+
+class filosofo(threading.Thread):
+       def __init__(self, izq, der, cant):
+               threading.Thread.__init__(self)
+               self.id = self.izq = izq
+               self.der = der
+               self.izq = izq
+               self.rnd = random.Random()
+               self.cant = cant # cantidad de veces que va a comer
+               self.comi = 0 # cantidad de veces que comio
+               self.derecha = False # indica si tengo el palito derecho
+               self.izquierda = False # indica si tengo el palito izquierdo
+               self.start()
+
+       def pensar(self):
+               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):
+               t = self.rnd.randint(1,5)
+               print 'Soy '+str(self.id)+' y voy a comer durante '+str(t)+' segundos'
+               self.comi = self.comi + 1
+               time.sleep(t)
+       
+       def lleno(self):
+               if self.cant == self.comi:
+                       return True
+               else: return False
+
+       def run(self):
+               while not self.lleno():
+                       self.pensar()
+                       if palitos[self.der].free():
+                               palitos[self.der].tomar()
+                               self.derecha = True
+                               print 'Soy '+str(self.id)+' y tome el palito derecho'
+                               if palitos[self.izq].free():
+                                       palitos[self.izq].tomar()
+                                       self.izquierda = True
+                                       print 'Soy '+str(self.id)+' y tome el palito izquierdo'
+                               else:
+                                       palitos[self.der].dejar()
+                                       self.derecha = self.izquierda = False
+                                       print 'Soy '+str(self.id)+' y deje el palito derecho'
+                       if self.derecha and self.izquierda:
+                               self.comer()
+                               palitos[self.der].dejar()
+                               palitos[self.izq].dejar()
+                               self.derecha = self.izquierda = False
+                               print 'Soy '+str(self.id)+' y deje los palitos'
+                       else: self.pensar()
+                       
+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()
+               
+       chinos = []
+       for i in range(int(sys.argv[1])):
+               palitos.append(palito(i))
+               chinos.append(filosofo(i,(i+1)%int(sys.argv[1]),int(sys.argv[2])))
+
+                               
+