Paolovox ha scritto:
Ti ringrazio.
Quando un thread fallisce ed un altro resta in attesa infinita per il rilascio delle risorse si chama "starvation" ovvero morte di fame?
Per prevenire tale situazione, tutti i threads andrebbero monitorati con un apposito gestore che controlla i loro valori di ritorno e nel caso uno fallisca, vengono rilasciate le risorse da esso acquisite?
O quale strategia implementativa si adotta?
Non esiste una strategia, ne esistono molte:
1) ogni linguaggio di programmazione mette a disposizione dei meccanismi che possono essere attivati in caso di eccezione: try/finally di Java, la chiamata del distruttore di un oggetto allocato nello stack in C++, ecc. Sfruttando questi meccanismi, ci si assicura che un thread, sia nel caso termini correttamente, sia che termini per eccezione, rilasci le risorse
2) si usa un timeout quando si cerca di acquisire un risorsa: se non viene acquisita in quel lasso di tempo, il thread continua con un'opportuna logica (termina con errore, segnala il problema, ecc)
3) si usano dei
lock con timeout: cioe' la risorsa rimane in carico al thread solo per un tempo massimo prestabilito, dopo di che il thread ne perde il controllo.
Un thread
non dovrebbe MAI essere ucciso dall'esterno, ma e' il thread stesso che termina correttamente o al limite si
suicida.
Un thread
non deve MAI bloccarsi per un tempo infinito, ma deve
sempre sbloccarsi e continuare con opportune logiche.
Eventualmente un thread usato come
watchdog potrebbe dire al thread di
suicidarsi: e questo puo' essere fatto
PROPRIO perche' il thread non resta
MAI bloccato per un tempo infinito.
Il
starvation e' un concetto leggermente diverso: in questo caso,
tutti i thread potrebbero potenzialmente acquisire le risorse, solo che alcuni non riescono mai a farlo ad esempio perche' hanno una priorita' troppo bassa e c'e' sempre un thread con priorita' piu' alta che li
frega.
Oppure il thread ottiene le risorse, ma prima di poter iniziare ad usarle gli vengono rimosse per essere consegnate a qualcun altro.