Domanda

Quali sono le migliori pratiche / modi di dire che qualcuno dovrebbe seguire per evitare deadlock?

È stato utile?

Altri suggerimenti

Esistono quattro condizioni che devono verificarsi affinché si verifichi un deadlock:

  1. Condizione di esclusione reciproca: una risorsa che non può essere utilizzata da più di un processo alla volta

  2. Condizione di attesa e attesa: i processi già in possesso di risorse possono richiedere nuove risorse

  3. Nessuna condizione di prelazione: nessuna risorsa può essere rimossa forzatamente da un processo che la contiene, le risorse possono essere rilasciate solo dall'azione esplicita del processo

  4. Condizione di attesa circolare: due o più processi formano una catena circolare in cui ogni processo attende una risorsa che detiene il processo successivo nella catena

Evita almeno uno di questi, e preferibilmente di più, e non dovresti avere troppi problemi.

Esiste il cosiddetto Algoritmo del banchiere , per evitare deadlock. Inoltre puoi prendere in considerazione l'uso di Watch Dog al fine di rompere il deadlock del modulo. Qui anche alcuni punti interessanti.

La tecnica canonica per evitare il deadlock è avere una gerarchia di blocchi. Assicurarsi che tutti i thread acquisiscano blocchi o altre risorse nello stesso ordine. Ciò evita lo scenario di deadlock in cui il thread 1 mantiene il blocco A e necessita del blocco B mentre il thread 2 mantiene il blocco B e necessita del blocco A. Con una gerarchia di blocchi, entrambi i thread dovrebbero acquisire i blocchi nello stesso ordine (ad esempio, A prima di B) .

La migliore pratica sarebbe quella di definire una classe per il thread e utilizzare solo i campi non statici di questa classe nel thread in modo che i thread non condividano memoria.
Ovviamente, per evitare deadlock potresti anche evitare l'uso di semafori, sezioni critiche e mutex. Meno è meglio, se si desidera evitare deadlock. Sfortunatamente, questi sono necessari se parte della memoria o altra risorsa è condivisa tra due thread oppure rischi di corrompere i dati.

Tra i vari metodi per accedere alle sezioni critiche - i semafori e i mutex sono i più popolari.

  • Un semaforo è un meccanismo di attesa e il mutex è un meccanismo di blocco, beh, il concetto confonde di più, ma in breve, un thread che attiva un mutex può solo disattivarlo. con questo in mente ...

  • Non consentire a nessun processo di bloccare un numero parziale di risorse, se un processo richiede 5 risorse, attendi fino a quando non sono disponibili tutte.

  • se usi il semaforo qui, puoi sbloccare / non aspettare la risorsa occupata da altri thread. con questo intendo dire che la prelazione è un'altra ragione.

Questi 2 secondo me sono le condizioni di base, le restanti 2 delle 4 precauzioni comuni possono essere correlate a queste.

Se non sei d'accordo ps aggiungi commenti. Ho gtg già in ritardo, aggiungerò in seguito una spiegazione più chiara e chiara.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top