Popis časování a zablokování

Překlady článku Překlady článku
ID článku: 317723 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Visual Basic .NET nebo Visual Basic 2005 nabízí možnost použití vlákna v aplikacích Visual Basic poprvé. Vlákna zavést ladění problémů časování a zablokování. Tento článek popisuje tyto dva problémy.

Další informace

Konflikty časování

Spor dochází, když dvě vlákna současně přístup ke sdílené proměnné. První podproces čte proměnné a druhý podproces čte z proměnné na stejnou hodnotu. První vlákno a druhý podproces provádění jejich operací na hodnotu a mohou soupeřit o viz vlákno, které může zapisovat hodnoty poslední sdílené proměnné. Hodnota vlákna, která zapíše jeho hodnotu poslední zůstane zachován, protože vlákno psaní nad hodnotou že autorem předchozí vlákna.

Podrobnosti a příklad

Každé vlákno je přidělen v předdefinovaných intervalech provádět na procesoru. Po uplynutí této doby, který je přiřazen pro vlákno, kontext podprocesu je uložen do svého příštího tahu na procesor a procesor vykonávání další vlákna.

Jak může způsobit jednořádkový příkaz spor? Podívejte se jak spor dochází v následujícím příkladu. Existují dvě vlákna a jak aktualizaci sdílené proměnné s názvem Celkový (která je reprezentována jako dword ptr ds: [031B49DCh] v kódu sestavení).

Kód jazyka Visual Basic:
   'Thread 1
   Total = Total + val1
				
   'Thread 2
   Total = Total - val2
				
Sestavení kódu (s čísly řádků) z kompilace předchozím kódu jazyka Visual Basic:
 '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 
				
Pohledem na sestavení kódu uvidíte kolik operací výkon procesoru na nižší úrovni provádět jednoduché sčítání. Podproces může být schopen spouštět celý nebo část kódu sestavení během jeho času na procesoru. Podívejte se nyní na jak spor dochází z tohoto kódu.

Celkem je 100, hodnota1 je 50 a hodnota2 15. Podproces získá příležitost k provedení, ale pouze dokončení kroků 1 až 3. To znamená, že vlákno 1 číst proměnnou a dokončit přidávání. Vlákno 1 nyní pouze čeká na zapsání jeho nová hodnota 150. Po zastavení podprocesu 1 vlákno 2 získá úplné provedení. To znamená, že ji napsal hodnota je vypočtena (85) variabilní celkové. Vlákno 1 nakonec získá ovládací prvek a ukončení zpracování. Zapíše hodnotu (150). Po dokončení podprocesu 1 hodnota celkem tedy nyní 150 místo 85.

Uvidíte, jak to může být velký problém. Pokud to program bankovnictví, zákazník má peníze na jejich účet, které by neměly být k dispozici.

Tato chyba je náhodné, protože je možné, že vlákno 1 Chcete-li dokončit jeho spuštění před jeho čas na procesor vyprší a začněte jeho spuštění podprocesu 2. Pokud dojde k těmto událostem, problém se nevyskytuje. Spouštění podprocesů je nedeterministické, proto nelze řídit času nebo pořadí jejich spuštění. Všimněte si také, že může podprocesy odlišně spustit v modulu runtime versus režimu ladění. Uvidíte také, že pokud spustit všechny podprocesy v řadě, došlo k chybě nedojde. Tato náhodnost je mnohem obtížnější pro sledování a ladění těchto chyb.

Vznikem sporu předejít, můžete zamknout sdílené proměnné, takže najednou pouze jeden podproces má přístup ke sdílené proměnné. Proveďte opatrně, protože pokud proměnná je uzamčen v podprocesu 1 a 2 vlákna také potřebuje proměnné, spuštění podprocesu 2 přestane při 2 podproces čeká vlákno 1 k uvolnění proměnné. (Další informace naleznete v tématu "SyncLock" v části "Odkazy" v tomto článku.)

Příznaky

Nejběžnější příznaky spor je neočekávané hodnoty proměnných, které jsou sdíleny mezi více vláken. Výsledkem nepředvídatelnost pořadí, ve kterém jsou podprocesy provést. Někdy jeden podproces wins a někdy další podproces wins. Jindy spuštění funguje správně. Se také, pokud každý podproces spuštěn samostatně, hodnota proměnné chová správně.

Zablokování

Zablokování dochází při dvou podprocesů každé jinou proměnnou zamknout ve stejnou dobu a zkuste uzamknout proměnnou, která již uzamčen jiným podprocesem. V důsledku toho každý podproces ukončen a čeká na uvolnění proměnné vlákno. Vzhledem k tomu, že každé vlákno drží proměnnou, která chce jiné vlákno, k ničemu nedošlo a vláken zůstanou zablokované.

Podrobnosti a příklad

Následující kód obsahuje dva objekty LeftVal a 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
				
Pokud je povoleno uzamčení LeftVal vlákno 1, dojde k zablokování. Procesor zastaví provádění podprocesu 1 a začne provádění podprocesu 2. Podproces 2 zámky RightVal a pak zkusí zamknout LeftVal. Vzhledem k tomu, že je uzamčen LeftVal vlákno 2 zastaví a čeká LeftVal být vydána. Vzhledem k tomu, že po zastavení podprocesu 2 1 vlákno je povoleno pokračovat v provádění. Podproces pokusí uzamknout RightVal, ale nelze, protože vlákno 2 uzamknul. V důsledku toho začne vlákno 1 počkat, až bude k dispozici RightVal. Každý podproces čeká vlákno, protože každé vlákno uzamkl jiný podproces čeká na proměnnou a ani jeden podproces je odemknutí proměnnou, která drží.

Zablokování vždy nedochází. Pokud vlákno 1 provede oba zámky před procesoru ho zastaví, vlákno 1 můžete provádět své operace a následnému odemknutí sdílené proměnné. Poté, co vlákno 1 odemkne proměnné, vlákno 2 můžete pokračovat s jeho provádění, podle očekávání.

Tato chyba je zřejmé tyto fragmenty kódu jsou umístěny vedle sebe, ale v praxi se může zobrazit kód v oblastech kódu nebo samostatné moduly. Tento velmi pevných chyba vysledovat příčinu, protože z tohoto stejného kódu spuštění správné a nesprávné spuštění může dojít.

Příznaky

Běžným příznakem zablokování je, že program nebo skupinu vláken přestane reagovat. To se nazývá také přestat reagovat. Nejméně dvě vlákna jsou vzájemně čekají proměnnou uzamčen jiným podprocesem. Podprocesy nelze pokračovat, protože ani jeden podproces uvolní své proměnné, dokud nenarazí na další proměnné. Celý program může zavěsit, pokud tento program čeká na jednom nebo obou těchto podprocesů k úplnému provedení.

Co je vlákno?

Procesy se používají k oddělení různých aplikací, které jsou spuštěny v určitou dobu v jednom počítači. Operační systém se nespustí procesy, ale proveďte podprocesů. Vlákno je jednotkou provádění. Operační systém přiděluje čas procesoru pro vlákno pro plnění úkolů vlákna. Spuštění více podprocesů může obsahovat jeden proces. Každé vlákno udržuje vlastní obslužné rutiny výjimek, plánování priorit a sadu struktur, které operační systém používá k uložení kontextu podprocesu, pokud podproces nelze dokončit jeho spuštění v době, která byla přiřazena k procesoru. Souvislosti je uchována až do příště, že vlákno obdrží čas procesoru. Kontext obsahuje všechny informace, že vlákno vyžaduje, aby bez problémů pokračovat v jeho provádění. Tyto informace zahrnují vlákna Sada registrů procesoru a zásobník volání uvnitř adresního prostoru hostitelského procesu.

Odkazy

Další informace hledat nápovědě k sadě Visual Studio pro následující klíčová slova:
  • SyncLock. Umožňuje objektu být uzamčen. Pokud jiný podproces se pokusí uzamknout téhož objektu, je blokován, dokud první podproces uvolní. Používejte opatrně, SyncLock, protože může dojít k potížím zneužití SyncLock. Tento příkaz můžete například zabránit časování ale způsobit zablokování.
  • Propojený. Umožňuje vybrat sadu operací vláken na základní číselné proměnné.
Další informace získáte klepnutím na níže uvedené číslo článku znalostní báze Microsoft Knowledge Base:
316422 INFO: Návod pro Threading v jazyce Visual Basic .NET
Další informace naleznete na následujícím webu MSDN:
Vláken a vláken

Vlastnosti

ID článku: 317723 - Poslední aktualizace: 28. října 2013 - Revize: 3.0
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Klíčová slova: 
kbvs2005swept kbvs2005applies kbinfo kbmt KB317723 KbMtcs
Strojově přeložený článek
DŮLEŽITÉ: Tento článek je přeložen pomocí softwaru na strojový překlad Microsoft. Nepřesný či chybný překlad lze opravit prostřednictvím technologie Community Translation Framework (CTF). Microsoft nabízí strojově přeložené, komunitou dodatečně upravované články, a články přeložené lidmi s cílem zajistit přístup ke všem článkům v naší znalostní bázi ve více jazycích. Strojově přeložené a dodatečně upravované články mohou obsahovat chyby ve slovníku, syntaxi a gramatice. Společnost Microsoft není odpovědná za jakékoliv nepřesnosti, chyby nebo škody způsobené nesprávným překladem obsahu nebo jeho použitím našimi zákazníky. Více o CTF naleznete na http://support.microsoft.com/gp/machine-translation-corrections/cs.
Projděte si také anglickou verzi článku: 317723

Dejte nám zpětnou vazbu

 

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