1 #! /usr/bin/env python2.4
8 palitos = [] #vector con los palitos
11 def __init__(self, id):
15 @synchronized('dejar')
19 @synchronized('libre')
23 @synchronized('tomar')
28 class filosofo(threading.Thread):
29 def __init__(self, izq, der, cant):
30 threading.Thread.__init__(self)
31 self.id = self.izq = izq
34 self.rnd = random.Random()
35 self.cant = cant # cantidad de veces que va a comer
36 self.comi = 0 # cantidad de veces que comio
37 self.derecha = False # indica si tengo el palito derecho
38 self.izquierda = False # indica si tengo el palito izquierdo
42 t = self.rnd.randint(1,5)
43 print 'Soy '+str(self.id)+' y voy a pensar durante '+str(t)+' segundos'
47 t = self.rnd.randint(1,5)
48 print 'Soy '+str(self.id)+' y voy a comer durante '+str(t)+' segundos'
49 self.comi = self.comi + 1
53 if self.cant == self.comi:
58 while not self.lleno():
60 if palitos[self.der].free():
61 palitos[self.der].tomar()
63 print 'Soy '+str(self.id)+' y tome el palito derecho'
64 if palitos[self.izq].free():
65 palitos[self.izq].tomar()
67 print 'Soy '+str(self.id)+' y tome el palito izquierdo'
69 palitos[self.der].dejar()
70 self.derecha = self.izquierda = False
71 print 'Soy '+str(self.id)+' y deje el palito derecho'
72 if self.derecha and self.izquierda:
74 palitos[self.der].dejar()
75 palitos[self.izq].dejar()
76 self.derecha = self.izquierda = False
77 print 'Soy '+str(self.id)+' y deje los palitos'
80 if __name__ == '__main__':
82 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>"
86 for i in range(int(sys.argv[1])):
87 palitos.append(palito(i))
88 chinos.append(filosofo(i,(i+1)%int(sys.argv[1]),int(sys.argv[2])))