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