Quando sarà sicuro scegliere la progettazione multi-thread senza dead lock? [chiuso]

-1

A volte abbiamo davvero bisogno di scegliere un design multi-thread, perché il single-threading bloccherà l'interfaccia utente o bloccherà un altro thread.

Ma a volte l'uso di più thread è solo una delle opzioni, ad esempio, è possibile sostituire il multi-threading con il timer. In tale situazione, è possibile evitare lo sforzo di esaminare il rischio di prestazioni dell'utilizzo del timer e andare direttamente al design multi-thread. Ma come sappiamo, il threading ha molti svantaggi:

  1. Problema di sincronizzazione.
  2. Il debug è difficile per il problema di sincronizzazione.
  3. Problema di deadlock.

Il numero 1 può sempre essere risolto aggiungendo blocchi e il terzo è il più difficile da risolvere, potrebbe essere necessario modificare i livelli di progettazione. Quindi concentriamoci su quando sarà sicuro scegliere il design multi-thread senza problemi di deadlock.

Uso le seguenti regole per giudicare che sia sicuro o meno:

  • Il componente ha solo i dati di input e l'interazione delle chiamate con le funzioni di ingresso.
  • Oppure il componente ha solo i dati di output e l'interazione con le chiamate di uscita.
  • Oppure hai dati di ingresso e di uscita o chiamate di funzione, ma puoi assicurarti che tutti i dati che entrano possano essere gestiti in modo asincrono. (Non riesco a pensare fuori dal caso, perché hai quasi sempre bisogno di sincronizzarti per spingere i dati in una coda.)

Questo ha senso per te, qualsiasi pensiero è benvenuto.

    
posta ZijingWu 23.09.2013 - 12:27
fonte

2 risposte

0

Ci sono due fonti di deadlock da considerare.

esiste un deadlock progettato , in cui la progettazione architettonica effettiva è la causa del deadlock. Per risolvere questo, è necessario comprendere il meccanismo che porta allo stallo e ridisegnare l'architettura. I problemi comuni includono l'avere due risorse che richiedono accesso esclusivo e diverse sezioni di codice che ottengono i blocchi per queste risorse in un ordine diverso.

La seconda fonte di deadlock è causata dal non rilascio dei lock in questo scenario, non è il design ma l'implementazione che è in errore. L'implementazione cattura l'accesso esclusivo, ma quando non ha più bisogno dell'accesso esclusivo non riesce a rilasciare il meccanismo di blocco. Questi bug non sono sempre facilmente identificabili perché il bug non è sempre dove il codice è bloccato.

Ci sono due buone strategie da adottare con le applicazioni multi-thread.

  1. Avere un'architettura davvero ben progettata. Questo ti permetterà di identificare ed evitare progettato in deadlock.
  2. Utilizzare un pacchetto di registrazione per registrare il flusso dell'applicazione e disporre di un livello di registrazione di traccia che registra i blocchi e si sblocca nel registro.

Con entrambi questi elementi hai le prove di ciò che è accaduto nel corso di una situazione di stallo.

    
risposta data 23.09.2013 - 13:13
fonte
0

Questo è un argomento importante. L'idea generale è di non condividere lo stato mutabile tra i thread. Se un thread può modificare un valore utilizzato da un altro thread o dipende da, è necessario gestire i problemi.

La tua prima regola è incompleta. I dati sono condivisi? Potresti aver bisogno di semantica atomica qui. Ad esempio un incremento è (indirettamente) una funzione di inserimento.

Il secondo potrebbe essere sufficiente, potrebbe non esserlo. Dipende da quali dati restituisce, su quali dati vengono utilizzati e quali altri dati dipendono dai dati restituiti, quindi penso che ci sia ancora la possibilità di un deadlock qui.

    
risposta data 23.09.2013 - 12:44
fonte

Leggi altre domande sui tag