Select the product you need help with
Descrizione delle condizioni di competizione e blocchi critici (deadlock)Identificativo articolo: 317723 - Visualizza i prodotti a cui si riferisce l?articolo. In questa paginaSommarioVisual 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. InformazioniRace conditionUna 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 dettagliOgni 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: 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). SintomiIl 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 dettagliIl codice riportato di seguito dispone di due oggetti, LeftVal e RightVal: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. SintomiUn 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.RiferimentiPer ulteriori informazioni, eseguire una ricerca della Guida di Visual Studio per le parole chiave seguenti:
316422 Per ulteriori informazioni, visitare il seguente sito Web MSDN (informazioni in lingua inglese):
(http://support.microsoft.com/kb/316422/EN-US/
)
INFO: Roadmap for Threading in Visual Basic .NET Threads and Threading
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconthreadsthreading.asp)
ProprietàIdentificativo articolo: 317723 - Ultima modifica: mercoledì 6 dicembre 2006 - Revisione: 2.3 Le informazioni in questo articolo si applicano a:
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
(http://support.microsoft.com/kb/317723/en-us/
)
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. | Traduzione articoli |




Torna all'inizio








