Abychom pochopili postupování ve VB.NET, pomáhá porozumět některým základním konceptům. Nejprve je to, že vytváření podprocesů je něco, co se děje, protože to operační systém podporuje. Microsoft Windows je preventivní multitaskingový operační systém. Část systému Windows nazvala plánovač úloh balík času procesoru všem spuštěným programům. Tyto malé kousky času procesoru se nazývají časové řezy. Programy nemají na starosti kolik času procesoru dostanou, plánovač úloh. Protože tyto časové řezy jsou tak malé, máte iluzi, že počítač dělá několik věcí najednou.
Definice vlákna
Vlákno je jediný sekvenční tok řízení.
Některé kvalifikace:
- Vlákno je „cesta provádění“ skrz toto tělo kódu.
- Vlákna sdílejí paměť, takže musí spolupracovat, aby dosáhly správného výsledku.
- Vlákno obsahuje data specifická pro vlákno, jako jsou registry, ukazatel zásobníku a čítač programu.
- Proces je jediné tělo kódu, které může mít mnoho vláken, ale má alespoň jeden a má jediný kontext (adresní prostor).
Toto je materiál na úrovni sestavení, ale do toho se dostanete, když začnete přemýšlet o vláknech.
Vícevláknové vs Multiprocesing
Vícevláknové zpracování není stejné jako vícejádrové paralelní zpracování, ale multithreading a multiprocesing fungují společně. Většina počítačů dnes má procesory, které mají alespoň dvě jádra, a běžné domácí stroje někdy mají až osm jader. Každé jádro je samostatný procesor, který je schopen samy spouštět programy. Zvýšení výkonu získáte, když operační systém přiřadí různým jádrům jiný proces. Použití více vláken a více procesorů pro ještě větší výkon se nazývá paralelismus na úrovni vláken.
Mnoho toho, co lze udělat, závisí na tom, co operační systém a hardware procesoru dokážou, ne vždy to, co ve svém programu můžete udělat, a neměli byste očekávat, že budete moci používat více vláken všechno. Ve skutečnosti možná nenajdete mnoho problémů, které mají prospěch z více vláken. Nepoužívejte proto vícevláknové zpracování, protože je tam. Výkon programu můžete snadno snížit, pokud není dobrým kandidátem na multithreading. Stejně jako příklady, video kodeky mohou být nejhoršími programy, které mají více vláken, protože data jsou ve své podstatě seriál. Serverové programy, které zpracovávají webové stránky, mohou patřit k nejlepším, protože různí klienti jsou ze své podstaty nezávislí.
Procvičování bezpečnosti nití
Vícevláknový kód často vyžaduje komplexní koordinaci podprocesů. Subtílné a obtížně vyhledatelné chyby jsou běžné, protože různá vlákna musí často sdílet stejná data, takže data mohou být změněna jedním vláknem, když to jiné neočekává. Obecný termín pro tento problém je „závodní stav“. Jinými slovy, dvě vlákna se mohou dostat do „závodu“ za účelem aktualizace stejných dat a výsledek se může lišit v závislosti na tom, které vlákno „vyhraje“. Jako triviální příklad předpokládejme, že kódujete smyčku:
Pokud počítadlo smyčky „I“ nečekaně vynechá číslo 7 a jde ze 6 na 8 - ale jen částečně - mělo by to katastrofální účinky na cokoli, co smyčka dělá. Prevence takovýchto problémů se nazývá bezpečnost vláken. Pokud program potřebuje výsledek jedné operace v pozdější operaci, pak nebude možné kódovat paralelní procesy nebo vlákna, aby to provedly.
Základní operace s více podprocesy
Je čas posunout tuto preventivní zprávu na pozadí a napsat nějaký multithreading kód. Tento článek právě používá aplikaci Console pro jednoduchost. Pokud chcete pokračovat, spusťte aplikaci Visual Studio s novým projektem konzolové aplikace.
Primární obor názvů používaný multithreadingem je Systém. Obor názvů vláken a třída vlákna vytvoří, spustí a zastaví nová vlákna. V níže uvedeném příkladu si všimněte, že TestMultiThreading je delegát. To znamená, že musíte použít název metody, kterou metoda Thread může volat.
V této aplikaci jsme mohli provést druhý Sub jednoduše tak, že jsme to nazvali:
Tím by byla celá aplikace spuštěna sériově. První výše uvedený příklad kódu však odstartuje podprogram TestMultiThreading a poté pokračuje.
Příklad rekurzivního algoritmu
Zde je aplikace s více podprocesy zahrnující výpočet permutací pole pomocí rekurzivního algoritmu. Zde není zobrazen celý kód. Pole povolených znaků je jednoduše „1“, „2“, „3“, „4“ a „5“. Tady je příslušná část kódu.
Všimněte si, že existují dva způsoby, jak zavolat podřízenou položku Permate (obě jsou uvedeny výše v kódu). Jeden odstartuje vlákno a druhý to volá přímo. Pokud tomu říkáte přímo, dostanete:
Pokud však nakopnete vlákno a místo toho spustíte subpříkaz Permate, dostanete:
To jasně ukazuje, že je vygenerována alespoň jedna permutace, potom se hlavní sub posune dopředu a skončí, zatímco se generují zbývající permutace, zobrazí se „Finished Main“. Protože displej pochází z druhé dílčí části, která se nazývá dílčí položka Permate, víte, že je také součástí nového vlákna. To ilustruje koncept, že vlákno je „cesta provádění“, jak bylo uvedeno výše.
Příklad závodu
První část tohoto článku zmiňovala stav závodu. Zde je příklad, který ukazuje přímo:
Okno Okamžité ukázalo tento výsledek v jedné zkoušce. Ostatní pokusy byly jiné. To je podstata závodního stavu.