Descrizione delle condizioni di competizione e blocchi critici (deadlock)

Identificativo articolo: 317723 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

Visual Basic .NET o Visual Basic 2005 offre la possibilità di utilizzare thread nelle applicazioni Visual Basic per la prima volta. Thread introdurre problemi di debug quali condizioni di competizione e blocchi critici (deadlock). In questo articolo vengono illustrati questi due problemi.

Informazioni

Race condition

Una race condition si verifica quando due thread accedere a una variabile condivisa nello stesso momento. Il primo thread legge la variabile e il secondo thread legge lo stesso valore della variabile. Quindi il primo thread e secondo thread eseguire le operazioni sul valore e sono gareggiare per visualizzare il thread può scrivere il valore ultima alla variabile condivisa. Il valore del thread che scrive il valore ultima viene mantenuto, perché il thread di scrittura sul valore che ha scritto il thread precedente.

Esempio e dettagli

Ogni thread viene allocato un periodo di tempo di esecuzione su un processore predefinito. Allo scadere del tempo allocato per il thread, contesto del thread viene salvato solo il turno successivo sul processore e il processore inizia l'esecuzione del thread successivo.

Come un comando di una riga può causare una condizione di competizione? Esaminare l'esempio riportato di seguito come si verifica una condizione di competizione. Esistono due thread ed entrambi sta aggiornando una variabile condivisa denominata Totale (che è rappresentato come dword ptr ds: [031B49DCh] nel codice assembly).

Codice di Visual Basic:
   'Thread 1
   Total = Total + val1
				
   'Thread 2
   Total = Total - val2
				
codice di assembly (con i numeri di riga) della compilazione del codice Visual Basic precedente:
 'Thread 1
 1.   mov         eax,dword ptr ds:[031B49DCh] 
 2.   add         eax,edi 
 3.   jno         00000033 
 4.   xor         ecx,ecx 
 5.   call        7611097F 
 6.   mov         dword ptr ds:[031B49DCh],eax 
				
 'Thread 2
 1.   mov         eax,dword ptr ds:[031B49DCh] 
 2.   sub         eax,edi 
 3.   jno         00000033 
 4.   xor         ecx,ecx 
 5.   call        76110BE7 
 6.   mov         dword ptr ds:[031B49DCh],eax 
				
per esaminare il codice dell'assembly, è possibile visualizzare il numero di operazioni il processore viene eseguita al livello inferiore per eseguire un calcolo semplice addizione. Un thread potrebbe essere possibile eseguire parte il codice assembly o durante il tempo del processore. Esaminare ora modalità da questo codice di una condizione di competizione.

Totale è pari a 100, val1 è 50 e val2 è 15. Thread 1 Ottiene un'opportunità per l'esecuzione ma solo completato i passaggi da 1 a 3. Ciò significa che thread 1 la variabile di leggere e completare l'aggiunta. Il thread 1 è in attesa solo di scrivere il nuovo valore pari a 150. Dopo che è stato interrotto thread 1, il thread 2 ottiene eseguire completamente. Ciò significa che ha scritto il valore che calcolato (85) uscita per il totale di variabile. Infine, il thread 1 torna nuovamente il controllo e al termine dell'esecuzione. Scrive il valore (150). Di conseguenza, al termine del thread 1, il valore del totale è ora 150 anziché 85.

È possibile visualizzare come questo può essere un grave problema. Se si trattasse di un programma di servizi bancari, il cliente potrebbe disporre di money il conto che non dovrebbe essere presente.

Questo errore è casuale, poiché è possibile per il thread 1 completare l'esecuzione prima in scadenza il processore e quindi thread 2 possibile iniziare l'esecuzione. Se si verificano tali eventi, il problema non si verifica. L'esecuzione del thread è non deterministico, pertanto non è possibile controllare il tempo o ordine di esecuzione. Si noti inoltre che i thread possono eseguire in modo diverso in fase di esecuzione e la modalità di debug. Inoltre, è possibile visualizzare che se si esegue ogni thread in serie, l'errore non si verifica. Questo casualità rende questi errori molto più difficile tenere traccia ed eseguire il debug.

Per impedire le condizioni di competizione, è possibile bloccare le variabili condivise, in modo che un solo thread alla volta possa accedere alla variabile condivisa. Questa operazione con parsimonia, perché se una variabile è bloccata in thread 1 e 2 thread deve inoltre la variabile, l'esecuzione del thread 2 interrotta mentre 2 thread in attesa di thread 1 rilasciare la variabile. (Per ulteriori informazioni, vedere "SyncLock" nella sezione "Riferimenti" di questo articolo).

Sintomi

Il sintomo più comune di una race condition è imprevedibili valori delle variabili che vengono condivisi tra più thread. Il risultato dai potenziali dell'ordine in cui il thread eseguire. A un giorno di un thread wins e un giorno imprecisato altri wins di thread. In altri casi, l'esecuzione funziona correttamente. Inoltre, se ogni thread viene eseguito separatamente, il valore della variabile comporta correttamente.

Blocchi critici (deadlock)

Un blocco critico (deadlock) si verifica quando due thread ogni bloccare una variabile diversa nello stesso momento e quindi tentare di bloccare la variabile che l'altro thread è già bloccato. Di conseguenza, ogni thread si interrompe l'esecuzione e attende che l'altro thread rilasciare la variabile. Poiché ogni thread tiene la variabile che si desidera che l'altro thread, non accade nulla e i thread restano blocco critico.

Esempio e dettagli

Il codice riportato di seguito dispone di due oggetti, LeftVal e RightVal:
'Thread 1
SyncLock LeftVal
 SyncLock RightVal
  'Perform operations on LeftVal and RightVal that require read and write.
 End SyncLock
End SyncLock
				
'Thread 2
SyncLock RightVal
 SyncLock LeftVal
  'Perform operations on RightVal and LeftVal that require read and write.
 End SyncLock
End SyncLock
				
un deadlock si verifica quando è possibile bloccare LeftVal Thread 1. Il processore interrompe l'esecuzione del thread 1 e inizia l'esecuzione del thread 2. Thread 2 blocchi RightVal e quindi tenta di bloccare LeftVal. Poiché LeftVal è bloccato, thread 2 si interrompe e attende LeftVal da rilasciare. Perché il thread 2 viene arrestato, il thread 1 è consentito per continuare l'esecuzione. Il thread 1 tenta di bloccare RightVal ma Impossibile, perché il thread 2 è bloccato. Di conseguenza, il thread 1 avviati attendere RightVal diventa disponibile. Ogni thread attende che l'altro thread, perché ogni thread ha bloccato la variabile che l'altro thread è in attesa di e nessuno dei due thread è lo sblocco la variabile da esso.

Un blocco critico (deadlock) non viene sempre eseguito. Se il thread 1 esegue entrambi i blocchi prima che il processore interrotta, thread 1 possibile eseguire le operazioni e quindi sbloccare la variabile condivisa. Dopo il thread 1 sblocca la variabile, thread 2 possibile procedere con l'esecuzione, come previsto.

Questo errore sembra ovvio quando questi frammenti di codice vengono inseriti side-by-side, ma in pratica, il codice potrebbe essere visualizzato in moduli separati o aree di codice. Questo un errore molto difficile tenere traccia perché, da questo stesso codice, può verificarsi sia in esecuzione corretto e in esecuzione non corretta.

Sintomi

Un sintomo comune di blocco critico (deadlock) è che il programma o un gruppo di thread si blocca. Questo è anche noto come un blocco . Almeno due thread sono ogni in attesa di una variabile che l'altro thread bloccato. I thread contrario non procedere, poiché nessuno dei due thread rilascerà la variabile fino ad arrivare l'altra variabile. Intero programma può bloccarsi se il programma è in attesa di uno o entrambi i thread per completare l'esecuzione.

Che cos'È un thread?

I processi vengono utilizzati per separare le applicazioni diverse che sono in esecuzione all'orario specificato in un singolo computer. Il sistema operativo non esegue i processi, ma thread eseguire. Un thread è un'unità di esecuzione. Il sistema operativo alloca tempo processore a un thread per l'esecuzione di attività del thread. Un singolo processo può contenere più thread di esecuzione. Ogni thread mantiene i proprio gestori di eccezioni, pianificazione di priorità e un insieme di strutture che il sistema operativo utilizza per salvare il contesto del thread se il thread non può completare l'esecuzione durante il periodo cui è stato assegnato il processore. Il contesto viene mantenuto fino alla successiva che il thread riceve il tempo del processore. Il contesto comprende tutte le informazioni che il thread è necessario per continuare senza problemi l'esecuzione. Queste informazioni includono set del thread di registri del processore e stack di chiamate all'interno di spazio degli indirizzi del processo host.

Riferimenti

Per ulteriori informazioni, eseguire una ricerca della Guida di Visual Studio per le parole chiave seguenti:
  • SyncLock . Consente a un oggetto da bloccare. Se un altro thread tenta di bloccare l'oggetto stesso, viene bloccato finché non rilascia il primo thread. Utilizzare SyncLock con attenzione, in quanto possono verificarsi dei problemi dall'utilizzo improprio di SyncLock. Ad esempio, questo comando può impedire race condition ma causare blocchi critici (deadlock).
  • interlock . Consente a un insieme selezionato di operazioni di thread-safe su base variabili numeriche.
Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
316422INFO: Roadmap for Threading in Visual Basic .NET
Per ulteriori informazioni, visitare il seguente sito Web MSDN (informazioni in lingua inglese):
Threads and Threading

Proprietà

Identificativo articolo: 317723 - Ultima modifica: mercoledì 6 dicembre 2006 - Revisione: 2.3
Le informazioni in questo articolo si applicano a:
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Chiavi: 
kbmt kbvs2005swept kbvs2005applies kbinfo KB317723 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 317723
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti