]> git.llucax.com Git - z.facultad/75.59/filosofos.git/blob - src/filosofos.py
Primer version con monitores.
[z.facultad/75.59/filosofos.git] / src / filosofos.py
1 #! /usr/bin/env python2.4
2 import threading
3 import sys
4 import random
5 import time
6 from sync import *
7
8
9 palitos = []
10 semaforos = []
11
12
13 class filosofo(threading.Thread):
14         def __init__(self, numeracion, cant):
15                 threading.Thread.__init__(self)
16                 self.id = numeracion
17                 self.rnd = random.Random()
18                 self.cant = cant # cantidad de veces que va a comer
19                 self.comi = 0 # cantidad de veces que comio
20                 self.derecho = False
21                 self.izquierdo = False
22                 self.start()
23         
24         @synchronized('Lock')
25         def agarrarPalitoDerecho(self):
26                 if self.id+1 == len(palitos): ind = 0
27                 else: ind = self.id+1
28                 self.derecho = palitos[ind]
29                 if self.derecho:
30                         palitos[ind] = False
31                         print 'Soy '+str(self.id)+' y agarre el palito derecho'
32                         return True
33                 else:
34                         self.derecho = False
35                         return False
36
37         @synchronized('Lock')
38         def dejarPalitoDerecho(self):
39                 if self.id+1 == len(palitos): ind = 0
40                 else: ind = self.id+1
41                 self.derecho = False
42                 palitos[ind] = True
43                 if self.derecho:
44                         print 'Soy '+str(self.id)+' y solte el palito derecho'
45         
46         @synchronized('Lock')
47         def agarrarPalitoIzquierdo(self):
48                 self.izquierdo = palitos[self.id]
49                 if self.izquierdo:
50                         palitos[self.id] = False
51                         print 'Soy '+str(self.id)+' y agarre el palito izquierdo'
52                         return True
53                 else:
54                         self.izquierdo = False
55                         return False
56
57         def pensar(self):
58                 t = self.rnd.randint(1,5)
59                 print 'Soy '+str(self.id)+' y voy a pensar durante '+str(t)+' segundos'
60                 time.sleep(t)
61
62         def comer(self):
63                 if self.derecho and self.izquierdo:
64                         t = self.rnd.randint(1,5)
65                         print 'Soy '+str(self.id)+' y voy a comer durante '+str(t)+' segundos'
66                         self.comi = self.comi + 1
67                         time.sleep(t)
68                         if self.id+1 == len(palitos): ind = 0
69                         else: ind = self.id+1
70                         self.derecho = self.izquierdo = False
71                         palitos[self.id] = True
72                         palitos[ind] = True
73                         print 'Soy '+str(self.id)+' y solte los palitos'
74                         return True
75                 else: return False
76                 
77         def lleno(self):
78                 if self.cant == self.comi: return True
79                 else: return False
80                 
81         def run(self):
82                 while not self.lleno():
83                         if self.agarrarPalitoDerecho():
84                                 self.agarrarPalitoIzquierdo()
85                         else: self.dejarPalitoDerecho()
86                         if not self.comer():
87                                 self.pensar()
88
89 if __name__ == '__main__':
90         if len(sys.argv) < 3:
91                 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>"
92                 sys.exit()
93         
94         chinos = []
95         for i in range(int(sys.argv[1])):
96                 palitos.append(True)
97                 chinos.append(filosofo(i,int(sys.argv[2])))
98