Beschreibung der Racebedingungen und deadlocks

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 317723 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Visual Basic .NET oder Visual Basic 2005 bietet zum ersten Mal die Möglichkeit, in Visual Basic-Anwendungen Threads zu verwenden. Threads stellen Sie beim Debuggen von Problemen wie z. B. Racebedingungen und Deadlocks vor. In diesem Artikel werden diese beiden Probleme untersucht.

Weitere Informationen

Racebedingungen

Eine Race-Bedingung tritt auf, wenn zwei Threads gleichzeitig auf eine freigegebene Variable zugreifen. Der erste Thread die Variable liest, und der zweite Thread liest den gleichen Wert aus der Variablen. Führen Sie dann den ersten Thread und einen zweiten Thread auf den Wert, und sie Rennen zu sehen, welcher Thread den Wert last auf die freigegebene Variable schreiben kann. Der Wert des Threads, der den Wert schreibt wird zuletzt beibehalten, weil der Thread, der vorherige Thread geschrieben hat gegenüber dem Wert schreibt.

Details und Beispiel

Jeder Thread wird einen vordefinierten Zeitraum für die Ausführung auf einem Prozessor zugeordnet. Nach Ablauf die Zeit, die für den Thread reserviert wird Kontext des Threads auf den Prozessor bis zu ihrer nächsten Zug gespeichert wird, und der Prozessor die Ausführung des nächsten Threads beginnt.

Verursachen ein einzeiligen Befehl kann wie eine Racebedingung? Untersuchen Sie die im folgende Beispiel, um zu sehen, wie eine Racebedingung auftreten. Zwei Threads vorhanden sind und beide eine gemeinsam genutzte Variable total aktualisieren (das wird als Dword Ptr ds: [031B49DCh] in den Assemblycode).

Visual Basic-Code:
   'Thread 1
   Total = Total + val1
				
   'Thread 2
   Total = Total - val2
				
Assemblycode (mit Zeilennummern) von der Aufbereitung der obigen Visual Basic-Code:
 '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 
				
Der Assemblycode ansehen, sehen Sie, wie viele Vorgänge des Prozessors führt auf der niedrigeren Ebene eine einfache Addition Berechnung ausgeführt. Ein Thread kann ganz oder teilweise von seiner Assemblycode während seiner Zeit auf dem Prozessor ausgeführt werden. Betrachten Sie nun eine Racebedingung wie aus diesem Code auftreten.

Insgesamt ist 100, val1 50 und val2 ist 15. Thread 1 erhält Gelegenheit zur Ausführung aber schließt nur die Schritte 1 bis 3. Dies bedeutet, dass Thread 1 die Variable lesen und das Hinzufügen abgeschlossen. Thread 1 jetzt wartet nur auf den neuen Wert von 150 zu schreiben. Nachdem der Thread 1 beendet wird, ruft Thread 2 vollständig ausgeführt. Dies bedeutet, dass es dem Wert geschrieben hat, dass er auf die Variable Summe (85), berechnet. Schließlich Thread 1 erhält wieder die Kontrolle und die Ausführung beendet. Es schreibt seinen Wert (150). Wenn Thread 1 abgeschlossen ist, wird der Wert des Gesamtbetrags daher jetzt 150 anstelle von 85.

Sie können sehen, wie dies möglicherweise ein großes Problem. Dies würde eine Anwendung für Bankgeschäfte, würde der Kunde Geld auf ihrem Konto haben, die nicht vorhanden sein sollte.

Dieser Fehler ist zufällig, da für Thread 1 auf die Ausführung der Zeit abgeschlossen werden kann der Prozessor läuft und Thread 2 können dann die Ausführung beginnen. Wenn diese Ereignisse auftreten, tritt das Problem nicht auf. Die Ausführung des Threads ist nicht deterministisch, damit Sie können nicht steuern, die Zeit oder die Reihenfolge der Ausführung. Beachten Sie außerdem, dass die Threads möglicherweise anders in Runtime im Vergleich zu den Debug-Modus ausgeführt. Außerdem können Sie sehen, dass Sie nacheinander jeden Thread ausführen, der Fehler nicht aufgetreten. Diese Zufälligkeit macht diese Fehler viel schwieriger aufzuspüren und zu debuggen.

Um die Racebedingungen zu verhindern können Sie freigegebene Variablen sperren, so dass jeweils nur ein Thread auf die freigegebene Variable zugreifen. Hierzu nur selten, da Ausführung von Thread 2 Wenn eine Variable, in Thread 1 gesperrt ist und Thread 2 auch die Variable muß, beendet wird, während der Thread 2 für Thread 1 auf die Variable release wartet. (Weitere Informationen finden Sie unter "SyncLock" im Abschnitt "Informationsquellen" dieses Artikels.)

Symptome

Das häufigste Symptom einer Racebedingung ist unvorhersehbare Werte von Variablen, die von mehreren Threads gemeinsam genutzt werden. Dies ergibt sich aus der Unberechenbarkeit der Reihenfolge, in der die Threads ausgeführt werden. Irgendwann ein Thread WINS-, und irgendwann gewinnt der andere Thread. In anderen Fällen funktioniert Ausführung korrekt. Auch wenn jedes Threads einzeln ausgeführt wird, verhält sich der Wert der Variable korrekt.

Deadlocks

Ein Deadlock tritt auf, wenn zwei Threads jeweils eine andere Variable zur gleichen Zeit zu sperren und anschließend versuchen, die Variable zu sperren, die der andere Thread bereits gesperrt. Daher wird jeder Thread die Ausführung beendet und wartet, bis der andere Thread die Variable freigegeben. Da jeder Thread wird die Variable, die der andere Thread möchte, geschieht nichts, und die Threads Uneinigkeit weiter.

Details und Beispiel

Der folgende Code enthält zwei Objekte, LeftVal und 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
				
Ein Deadlock tritt auf, wenn Thread 1 gestattet ist, LeftVal zu sperren. Der Prozessor beendet die Ausführung von Thread 1 und beginnt die Ausführung von Thread 2. Thread 2 Sperren RightVal und anschließend versucht, LeftVal zu sperren. Da LeftVal gesperrt wird, ist Thread 2 beendet und wartet auf LeftVal freigegeben werden. Da Thread 2 beendet ist, darf Thread 1 weiter ausgeführt werden. Thread 1 versucht, RightVal zu sperren, aber nicht, da Thread 2 er gesperrt wurde. Thread 1 wird daher warten, bis der RightVal verfügbar ist. Jeder Thread wartet des andere Threads, da jeder Thread die Variable gesperrt hat, auf die der andere Thread wartet, und keiner der beiden Threads ist Entsperren der Variablen, die es enthält.

Ein Deadlock tritt nicht immer. Wenn Thread 1 beide Sperren ausgeführt wird, bevor der Prozessor stoppt, können Thread 1 ihren Betrieb und entsperren Sie gemeinsam genutzte Variable. Nachdem Thread 1 die Variable aufhebt, kann der Thread 2 mit der Ausführung wie erwartet fortgesetzt.

Dieser Fehler offensichtlich, wenn diese Codeausschnitte werden nebeneinander platziert, aber in der Praxis kann der Code in separate Module oder Bereiche des Codes angezeigt. Diese einen sehr schwerwiegenden Fehler aufspüren, da durch diese denselben Code korrekt ausgeführt werden und fehlerhaften Ausführung auftreten können.

Symptome

Ein häufig auftretendes Problem eines Deadlocks ist, dass das Programm oder die Gruppe von Threads nicht mehr reagiert. Dies ist auch ein hängen. Mindestens zwei Threads sind warten, dass eine Variable, die von der anderen Thread gesperrt. Die Threads nicht fortgesetzt werden, da keiner der beiden Threads, bis sie die andere Variable erhält die Variable freigegeben wird. Das gesamte Programm kann hängen, wenn das Programm auf eine oder beide dieser Threads auf die vollständige Ausführung wartet.

Was ist ein Thread?

Prozesse werden zur Trennung der verschiedenen Anwendungen, die zu einem bestimmten Zeitpunkt auf einem einzelnen Computer ausgeführt werden. Das Betriebssystem führt keine Prozesse, aber Threads nicht. Ein Thread ist eine Ausführungseinheit. Das Betriebssystem ordnet Prozessorzeit für einen Thread für die Ausführung des Tasks für den Thread. Ein einzelnen Prozess kann mehrere Ausführungsthreads enthalten. Jeder Thread verwaltet eine eigene Ausnahmehandler, Planen von Prioritäten und eine Gruppe von Strukturen, die das Betriebssystem verwendet die Threadkontext speichern, wenn der Thread die Ausführung während der Zeit abgeschlossen werden kann, die es dem Prozessor zugewiesen wurde. Der Kontext wird erst beim nächsten statt, dass der Thread Prozessorzeit empfängt. Der Kontext schließt alle Informationen, die der Thread auch weiterhin problemlos seine Ausführung erfordert. Diese Informationen umfassen die Gruppe der Prozessor-Register und die Aufrufliste in den Adressraum des Hostprozesses ausgeführt.

Informationsquellen

Weitere Informationen finden Sie unter Visual Studio-Hilfe unter der folgenden Schlüsselwörter:
  • SyncLock. Ermöglicht es einem Objekt gesperrt werden. Wenn ein anderer Thread versucht, dasselbe Objekt zu sperren, wird er blockiert, bis der erste Thread freigibt. Verwenden Sie SyncLock sorgfältig durch, da Probleme vor Missbrauch der SyncLock führen können. Dieser Befehl kann z. B. zu verhindern, dass Racebedingungen jedoch Deadlocks verursachen.
  • InterLocked. Eine Reihe von threadsichere Operationen auf einfachen numerischen Variablen ermöglicht.
Weitere Informationen finden Sie in folgendem Artikel der Microsoft Knowledge Base:
316422 INFO: Wegweiser für Threading in Visual Basic .NET
Weitere Informationen finden Sie auf der folgenden MSDN-Website:
Threads und Threading

Eigenschaften

Artikel-ID: 317723 - Geändert am: Samstag, 23. November 2013 - Version: 4.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Keywords: 
kbvs2005swept kbvs2005applies kbinfo kbmt KB317723 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell übersetzt und wird dann möglicherweise mithilfe des Community Translation Framework (CTF) von Mitgliedern unserer Microsoft Community nachbearbeitet. Weitere Informationen zu CTF finden Sie unter http://support.microsoft.com/gp/machine-translation-corrections/de.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 317723
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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