+#! /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])))
+
+
+