perfetto grazie mille...vedo che nonostante il mio impegno sono ancora un pivello...
Comunque ho un'altro problema con global...in questo programma ho dovuto proprio metterlo...è il caso particolare che devo lasciarlo? o sennò come si toglie? grazie infinite... #import nomemodulo...i moduli contengono classi...che a loro volta contengono funzioni... import threading import time import thread import random """ thread lettori che devono agire concorrentemente all'uso della stanza la stanza è una risorsa comune non condivisibile gli accreditati hanno più priorità rispetto agli occasionali gli occasionali oltre che aspettare che la sala sia libera devono aspettare che non ci siano accreditati uso semaofri privati """ class Lettore(threading.Thread): #nomemodulo.Classe #il costruttore, self e' come this in java...solo che non e' una parola chiave... def __init__(self, accreditato): self.accreditato = accreditato threading.Thread.__init__(self) def run(self): print self.getName() + " attivato \n" time.sleep(random.randrange(10, 20, 1)) print self.getName() + " aspetta di entrare \n" leggi(self.accreditato) print self.getName() + " entra e legge \n" time.sleep(random.randrange(5, 10, 1)) print self.getName() + " restituisce \n" restituisci() def leggi(accreditato): #adesso i thread si mettono in coda global coda_Accreditati, coda_Occasionali, stanza_libera mutex.acquire() if accreditato: coda_Accreditati+=1 else: coda_Occasionali+=1 mutex.release() #ora i thread cercano di acquisire la risorsa mutex.acquire() if stanza_libera: stanza_libera=False if accreditato: coda_Accreditati-=1 cAccreditati.release() else: if (not accreditato) and coda_Accreditati==0: coda_Occasionali-=1 cOccasionali.release() mutex.release() if accreditato: cAccreditati.acquire() else: cOccasionali.acquire() def restituisci(): global coda_Accreditati, coda_Occasionali, stanza_libera mutex.acquire() if coda_Accreditati>0: coda_Accreditati-=1 cAccreditati.release() else: if coda_Occasionali>0 and coda_Accreditati==0: coda_Occasionali-=1 cOccasionali.release() else: stanza_libera=True mutex.release() #mutua esclusione..vabbeh non uso un semaforo...ma il discorso non cambia... mutex = threading.Lock() #dalla documentazione in rete si capisce che i semafori implementati da python sono numerici... #non ci vuole molta fantasia a renderli binari... ;-) cAccreditati = threading.Semaphore(0) cOccasionali = threading.Semaphore(0) stanza_libera=True coda_Accreditati=0 coda_Occasionali=0 num_Accreditati=3 num_Occasionali=3 #creo e attivo i miei thread for i in range(num_Occasionali): thread = Lettore(False) thread.setName("Occasionale" + str(i)) thread.start() for i in range(num_Accreditati): thread = Lettore(True) thread.setName("Accreditato" + str(i)) thread.start() #questo programma provoca starvation degli occasionali se ciclato il run..ovvio!!!... #http://docs.python.org/lib/semaphore-objects.html _______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python