Il programma, dopo aver incluso i moduli threads e threads::shared
(quest'ultimo è necessario per poter condividere variabili tra un
thread e l'altro), definisce alcune variabili iniziali: numero di
palline appartenenti al club; nomi dei giocatori (per rendere possibile
una immediata distinzione visiva di ciasun thread); tempo massimo
a disposizione di ogni giocatore per completare una partita; tempo
di attesa nel caso in cui il club rifiuti di concedere le palline al
giocatore; tempo di attesa tra la restituzione delle palline ed una
nuova richiesta di altre; numero massimo di palline che un singolo
giocatore può richiedere in una volta. Notate inoltre, in questa
sezione, che $palline viene definita come shared, ed assume un
valore iniziale uguale a quello di $pallinetot: questa variabile
rappresenta infatti il numero di palline che il club ha in un
determinato istante, ed è condivisa tra tutti i thread/giocatori.
A questo punto vengono creati i thread corrispondenti ai vari
giocatori, ed i loro handle vengono memorizzati nell'array @g.
La creazione di un thread avviene passando al costruttore la reference
alla funzione che costituirà il blocco di codice principale del
thread, ed un parametro per essa, cioè il nome del giocatore.
Una volta creati i thread, essi iniziano subito la loro esecuzione,
ed è necessario effettuare un join() di tutti essi. Ciò
avviene nel ciclo sottostante. Una volta che tutti i thread sono stati
uniti al programma principale, esso attende la loro fine prima
di chiudere (il che, come vedremo dopo, significa in questo caso
che il programma gira in eterno). Se non avessimo chiamato join()
per ogni thread, o al suo posto avessimo chiamato detach(), il
programma sarebbe terminato quasi subito con l'errore:
A thread exited while 26 other threads were still running.
Questo indica che tutti i thread dipendenti da quello principale
non hanno potuto terminare la loro esecuzione, in quanto il
thread principale è uscito. |