Descrizione delle condizioni di competizione e deadlock

Traduzione articoli Traduzione articoli
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 i thread nelle applicazioni Visual Basic per la prima volta. Thread introdurre problemi di debug, quali le condizioni di competizione e deadlock. In questo articolo vengono illustrati questi due problemi.

Informazioni

Condizioni di competizione

Una condizione di competizione si verifica quando due thread accedono a una variabile condivisa nello stesso momento. Il primo thread che legge la variabile e il secondo thread legge lo stesso valore della variabile. Quindi il primo thread e il secondo thread eseguono le loro operazioni sul valore e poi concorrono per vedere quale thread può scrivere l'ultimo valore nella variabile condivisa. Viene mantenuto il valore del thread che scrive il valore per ultimo, perché il thread sta sovrascrivendo il valore creato dal thread precedente.

Esempio e dettagli

Ogni thread viene assegnato un periodo di tempo per l'esecuzione su un processore predefinito. Quando scade il tempo allocato per il thread, viene salvato il contesto del thread fino al proprio turno successivo del 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 per vedere come si verifica una condizione di competizione. Esistono due thread ed entrambi sono l'aggiornamento di 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 assembly (con 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 
				
Esaminando il codice dell'assembly, è possibile visualizzare il numero di operazioni del processore è attualmente in esecuzione al livello inferiore per eseguire una semplice addizione. Un thread può essere in grado di eseguire tutto o parte del codice assembly durante il tempo del processore. Esaminare come si verifica una condizione di competizione da questo codice.

Totale è 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 il Thread 1 lettura della variabile e completata l'aggiunta. Il thread 1 è in attesa solo per scrivere il nuovo valore pari a 150. Dopo l'interruzione del Thread 1, 2 Thread Ottiene eseguire completamente. Ciò significa che essa ha scritto il valore è calcolato (85) out per il totale di variabili. Infine, il Thread 1 controllo e termina l'esecuzione. Scrive il valore (150). Pertanto, al termine del Thread 1, il valore del totale è ora 150 invece di 85.

È possibile vedere come questo potrebbe essere un grosso problema. Se si trattasse di un programma per operazioni bancarie, il cliente dovrebbe money nel proprio account non dovrebbe essere presente.

Questo errore è casuale, poiché è possibile che il Thread 1 completare l'esecuzione prima l'ora in scadenza il processore e quindi Thread 2 può iniziare l'esecuzione. Se si verificano questi eventi, il problema non si verifica. L'esecuzione del thread è non deterministico, pertanto non è possibile controllare il tempo o un ordine di esecuzione. Si noti inoltre che i thread possono essere eseguiti in modo diverso in runtime e la modalità di debug. Vedere anche che se si esegue ogni thread in serie, l'errore non si verifica. Questa casualità rende molto più difficile tenere traccia e debug di questi errori.

Per evitare race condition, è possibile bloccare le variabili condivise, in modo che un solo thread alla volta ha accesso alla variabile condivisa. Questa operazione con cautela, perché se una variabile viene bloccata nel Thread 1 e 2 Thread deve anche la variabile, l'esecuzione del Thread 2 si interrompe mentre 2 Thread in attesa che il 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. Ciò è dovuto imprevedibilità nell'ordine in cui è in esecuzione il thread. Un intervallo di tempo un thread wins e un intervallo di tempo il server wins thread. In altri casi, l'esecuzione funzioni correttamente. Inoltre, se ogni thread viene eseguito separatamente, il valore della variabile si comporti correttamente.

Deadlock

Un deadlock si verifica quando due thread ognuno bloccare una variabile diversa nello stesso momento e quindi si tenta di bloccare la variabile già bloccato da altro thread. Di conseguenza, ogni thread interrompe l'esecuzione e attende che l'altro thread rilasciare la variabile. Poiché ogni thread contiene la variabile è richiesto un altro thread, non accade nulla e il thread restano deadlock.

Esempio e dettagli

Il codice riportato di seguito ha 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 il Thread 1 è consentito bloccare LeftVal. Il processore interrompe l'esecuzione del Thread 1 e inizia l'esecuzione del Thread 2. 2 Blocchi RightVal e quindi tenta di bloccare LeftVal di thread. Perché è bloccato LeftVal, Thread 2 si interrompe e attende che LeftVal da rilasciare. Poiché il Thread 2 viene arrestato, il Thread 1 può continuare l'esecuzione. Il thread 1 tenta di bloccare RightVal ma non è possibile, perché blocca Thread 2. Di conseguenza, il Thread 1 inizia ad attendere finché non diventa disponibile RightVal. Ogni thread attende che l'altro thread, perché ogni thread ha bloccato la variabile è in attesa di altri thread e nessuno dei due thread è lo sblocco della variabile in esso contenute.

Un deadlock non sempre si verificano. Se il Thread 1 esegue entrambi i blocchi prima che il processore si interrompe, il Thread 1 può eseguire le operazioni e quindi sbloccare la variabile condivisa. Una volta che il Thread 1 Sblocca la variabile, Thread 2 procedere con l'esecuzione, come previsto.

Questo errore appare evidente quando questi frammenti di codice sono collocati fianco a fianco, ma in pratica, il codice venga visualizzato in moduli separati o aree del codice. Questo genera un errore molto difficile risalire perché da questo stesso codice, può verificarsi l'esecuzione corretta e l'esecuzione non corretta.

Sintomi

Un sintomo comune di blocco critico è che il programma o il gruppo di thread si blocca. È noto anche come un blocco. Almeno due thread sono in attesa per una variabile bloccato da altro thread. I thread non procedere, poiché nessuno dei due thread rilascerà la variabile fino ad arrivare l'altra variabile. Blocco dell'intero programma se il programma è in attesa di uno o entrambi i thread per completare l'esecuzione.

Che cos'è un Thread?

Processi vengono utilizzati per separare le diverse applicazioni in esecuzione in un momento specificato in un singolo computer. Il sistema operativo non eseguire processi, ma tale thread. Un thread è un'unità di esecuzione. Il sistema operativo alloca il tempo del processore per un thread per l'esecuzione delle attività del thread. Un singolo processo può contenere più thread di esecuzione. Ogni thread gestisce i propri gestori di eccezioni, pianificazione delle priorità e un insieme di strutture del sistema operativo utilizzate per salvare il contesto del thread se il thread non può completare l'esecuzione durante il periodo in cui era stata assegnata al processore. Il contesto viene mantenuto fino alla successiva che il thread riceve il tempo del processore. Il contesto include tutte le informazioni che il thread richiede di continuare senza problemi l'esecuzione. Queste informazioni includono l'insieme dei registri del processore e lo stack di chiamate all'interno di spazio di indirizzi del processo host.

Riferimenti

Per ulteriori informazioni, cercare le seguenti parole chiave nella Guida di Visual Studio:
  • SyncLock. Consente di bloccare un oggetto. Se un altro thread tenta di bloccare lo stesso oggetto, ma viene bloccata fino a quando non si rilascia il primo thread. Utilizzare SyncLock con attenzione, poiché i problemi derivanti dall'uso scorretto del SyncLock. Ad esempio, questo comando può evitare race condition ma dare luogo a deadlock.
  • InterLocked. Consente a un insieme di operazioni thread-safe su base variabili numeriche.
Per ulteriori informazioni, fare clic sul numero dell'articolo per visualizzare l'articolo della Microsoft Knowledge Base:
316422 INFO: Roadmap per il Threading in Visual Basic .NET
Per ulteriori informazioni, vedere il seguente sito Web MSDN:
Thread e Threading

Proprietà

Identificativo articolo: 317723 - Ultima modifica: martedì 29 ottobre 2013 - Revisione: 3.0
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: 
kbvs2005swept kbvs2005applies kbinfo kbmt KB317723 KbMtit
Traduzione automatica articoli
IMPORTANTE: il presente articolo è stato tradotto tramite un software di traduzione automatica di Microsoft ed eventualmente revisionato dalla community Microsoft tramite la tecnologia CTF (Community Translation Framework) o da un traduttore professionista. Microsoft offre articoli tradotti manualmente e altri tradotti automaticamente e rivisti dalla community con l?obiettivo di consentire all'utente di accedere a tutti gli articoli della Knowledge Base nella propria lingua. Tuttavia, un articolo tradotto automaticamente, anche se rivisto dalla community, non sempre è perfetto. Potrebbe contenere errori di vocabolario, di sintassi o di grammatica. Microsoft declina ogni responsabilità per imprecisioni, errori o danni causati da una traduzione sbagliata o dal relativo utilizzo da parte dei clienti. Microsoft aggiorna frequentemente il software e gli strumenti di traduzione automatica per continuare a migliorare la qualità della traduzione.
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

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com