da
Luca1995 » 27 set 2017, 13:19
Dato che l'esempio dipende troppo da come è scritto il codice vediamo il seguente (che è quello proposto in classe dalla professoressa):
- Codice: Seleziona tutto
variabile victim condivisa tra i thread con r/w atomiche!
void lock(){
int i = this.ID;
victim = i;
while(victim == i);
}
void unlock(){}
Mettiamo che i thread che si alternano per entrare nella sezione critica siano 2.
Da quello che so io, perché ci sia deadlock tutti i thread non devono riuscire in nessun modo ad effettuare progressi.
Supponendo che A sia fermo sul suo ciclo di attesa, B è comunque libero di fare quello che vuole finché non richiede l'accesso alla sezione critica, sbloccando B.
Da come wikipedia definisce il deadlock (ed anche il libro SilberSchatz di sistemi operativi) sono necessarie alcune condizioni affinché ci sia, per esempio quella dell'attesa circolare: in questo caso però B non è in attesa di niente di quello richiesto anche da A, quindi è libero di fare ciò che vuole e quindi in caso di sbloccare A. Dato che A è quindi sbloccabile (anche se potenzialmente dopo tantissimo tempo) non penso si tratti di deadlock. Dal deadlock non si dovrebbe poter uscire. Non riesco ad immaginare una situazione in cui uno dei thread sia in attesa e non potrà mai più continuare la sua esecuzione.
In questo caso mi sembra molto più appropriato il termine starvation, quindi che cosa sbaglio?