Popis sporech a zablokování

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žít podprocesů v aplikacích jazyka pro první. Podprocesy představují ladění problémy jako například sporech a zablokování. Tento článek prozkoumá tyto dva problémy.

Další informace

Podmínky závodů

Spor dochází při dvou podprocesů přístup sdílené proměnné současně. Přečte první podproces proměnné a druhý podproces čte z proměnné stejnou hodnotu. Potom podproces první a druhý podproces provádění jejich operací na hodnotě a mohou soupeřit viz podproces, který může zapsat hodnotu poslední sdílené proměnné. Hodnota podproces zapíše jeho hodnotu poslední je zachována, protože podprocesu je psaní nad hodnotou, že předchozí podproces autorem.

Podrobnosti a příklad

Každý podproces je přidělen předdefinované období čas spuštění procesoru. Po vypršení času, který je přiřazen pro podproces kontext podprocesu je uloženo dokud jeho další zapnout na procesoru a začne provádění dalšího podproces procesoru.

Jak lze příkaz jednořádkový způsobit spor? Prozkoumejte následující příklad dochází spor. Existují dva podprocesů a obě jsou aktualizace sdílené proměnné s názvem Celkový (které je představováno dword ptr ds: [031B49DCh] v kódu sestavení).

Kód jazyka:
   'Thread 1
   Total = Total + val1
				
   'Thread 2
   Total = Total - val2
				
sestavení (s kódem čísla řádku) z kompilace předchozí kód jazyka:
 '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 
				
podle prohlédnete kód sestavení můžete vidět kolik operací procesoru provádění na nižší úrovni provést jednoduché Přidání výpočtu. Podproces možné během jeho čas na procesoru provést všechny nebo část jeho kód sestavení. Prohlédněte nyní jak spor dochází z tohoto kódu.

Součet je 100 je 50 hodn1 a hodn2 je 15. Podproces 1 získává příležitost spouštět, ale pouze dokončí kroky 1 až 3. To znamená, že vlákno 1 číst proměnné a dokončení přidávání. Podproces 1 nyní právě čeká zapsat mimo jeho novou hodnotu 150. Po zastavení podprocesu 1 vlákno 2 získává zcela spustit. To znamená, že ji má zapsána hodnota, ji vypočítat (85) mimo k proměnné celkem. Nakonec vlákno 1 regains ovládací prvek a dokončí provádění. Zapíše jej mimo jeho hodnota (150). Po dokončení vlákno 1 hodnota celkem je tedy nyní 150 namísto 85.

Viz Jak může být hlavní problém. Pokud to byly program bankovnictví, zákazník musel peněz v jejich účet by měl být přítomen.

Tato chyba je náhodné, protože je možné pro vlákno 1 na dokončení jeho spuštění před jeho čas procesoru vyprší a potom vlákno 2 lze zahájit jeho spuštění. Pokud dojde k těmto událostem nedochází problém. Podproces provádění je nedeterministické, proto nelze řídit pořadí provádění nebo čas. Všimněte si také, může podprocesy odlišně spustit v modulu runtime versus režimu ladění. Viz také, že pokud spouštět každý podproces v řadě došlo k chybě nedojde. Díky této randomness tyto chyby mnohem těžší sledovat a ladění.

K sporech zabránit, můžete zamknout sdílené proměnné tak, aby najednou pouze jeden podproces má přístup ke sdílené proměnné. To opatrně, protože pokud proměnná je uzamčen v podprocesu 1 a 2 vlákno také potřebuje proměnné vlákno 2 spuštění zastaví během 2 podproces čeká vlákno 1 uvolnění proměnné. (Další informace viz "SyncLock" v "Odkazy")

Příznaky

Nejběžnější příznaku spor je nepředvídatelné hodnot proměnných, které jsou sdíleny mezi více podprocesů. To výsledky z unpredictability pořadí, ve kterém spouštět podprocesy. Někdy jeden podproces wins a někdy jiných podprocesu wins. Jindy provádění pracuje správně. Také Pokud je každý podproces spuštěn samostatně, hodnotu proměnné chová správně.

Zablokování

Zablokování dochází, když dvou podprocesů každé uzamknout různé proměnné současně a pokusu zamknout proměnné podproces již uzamčena. Výsledkem je každý podproces zastaví provádění a čeká jiných podproces uvolnění proměnné. Protože každý podproces drží proměnné, kterou chce podprocesu, nedojde k žádné akci, a zůstávají zablokované podprocesy.

Podrobnosti a příklad

Následující kód obsahuje 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
				
zablokování dochází při vlákno 1 je povoleno uzamčení LeftVal. Procesor zastaví provádění podprocesu 1 a začne provádění podprocesu 2. Podproces 2 uzamčení RightVal a potom pokusí uzamknout LeftVal. Protože je uzamčen LeftVal vlákno 2 zastaví a čeká LeftVal být uvolněny. Protože zastaven vlákno 2 vlákno 1 povoleno provádění pokračovat. Podproces 1 pokusí uzamknout RightVal, ale nelze, protože vlákno 2 uzamknul. Výsledkem je spustí vlákno 1 počkat, dokud RightVal k dispozici. Každý podproces čeká podproces jiných protože každý podproces má proměnná jiných podproces čeká na uzamčen a žádný z podprocesu odemykání proměnné je stisknuté.

Zablokování vždy nedojde. Pokud vlákno 1 provede obě uzamčení před procesor zastaví jej, vlákno 1 provedení jeho operací a Odemknout sdílený proměnné. Po 1 vlákno odemkne proměnné, můžete vlákno 2 očekávaným pokračovat s jeho spuštění.

Tato chyba se zdá zřejmé při těchto fragmenty kódu jsou umístěny vedle sebe, ale v praxi pravděpodobně kód zobrazí v samostatné moduly nebo oblastech váš kód. Tento velmi závažná chyba sledovat, protože stejný kód, může dojít provádění správné a nesprávné provádění.

Příznaky

Běžné příznaku zablokování je, že program nebo skupiny podprocesů přestane reagovat. Toto je známé také jako přestat reagovat. Nejméně dva podprocesů jsou jednotlivé čekání pro proměnnou uzamčen jiným podprocesem. Podprocesy není pokračovat, protože ani podproces uvolnění jeho proměnné, dokud získává jiné proměnné. Celý program může přestat reagovat, pokud program čeká na jednom nebo obou těchto podprocesů dokončení provádění.

Co je vlákno?

Procesy slouží k oddělení různých aplikací provádění v určený čas v jednom počítači. Operační systém spustit procesy, ale proveďte podprocesů. Podproces je jednotka provádění. Operační systém přiděluje čas procesoru pro podproces pro provádění podprocesu úkoly. Jeden proces může obsahovat více podprocesů provádění. Každý podproces udržuje vlastní obslužné rutiny výjimka plánování priorit a sadu struktur operační systém používá uložit kontext podprocesu, pokud podproces nelze dokončit jeho spuštění během doby, která byla přiřazena procesoru. V kontextu uchovávány až při příštím podprocesu obdrží čas procesoru. Kontext obsahuje informace, vyžaduje plynule pokračovat jeho spuštění podprocesu. Tyto informace zahrnují podprocesu Sada registrů procesoru a zásobník volání uvnitř adresový prostor procesu hostitele.

Odkazy

Další informace hledat nápovědě Visual Studio následující klíčová slova:
  • SyncLock. Umožňuje objektu být uzamčen. Pokud jiný podproces se pokusí uzamknout stejného objektu, je blokován, dokud uvolní první podproces. Použít SyncLock pečlivě, protože problémy mohou být výsledkem zneužití SyncLock. Tento příkaz lze například zabránit sporech ale způsobit zablokování.
  • InterLocked. Umožňuje vybrat sadu operací podproces bezpečné na základní číselné proměnné.
Další informace naleznete v následujícím článku znalostní báze Microsoft Knowledge Base:
316422INFORMACE: Průvodce pro threading jazyka .NET
Další informace naleznete na následujícím webu:
Threads and Threading

Vlastnosti

ID článku: 317723 - Poslední aktualizace: 6. prosince 2006 - Revize: 2.3
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: 
kbmt kbvs2005swept kbvs2005applies kbinfo KB317723 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:317723

Dejte nám zpětnou vazbu