Threading Introductie in Visual Basic

click fraud protection

Om threading in VB.NET te begrijpen, helpt het om enkele basisconcepten te begrijpen. Ten eerste is threading iets dat gebeurt omdat het besturingssysteem dit ondersteunt. Microsoft Windows is een preventief multitasking-besturingssysteem. Een onderdeel van Windows, de taakplanner, verdeelt de processortijd naar alle actieve programma's. Deze kleine stukjes processortijd worden tijdschijven genoemd. Programma's bepalen niet hoeveel processortijd ze krijgen, de taakplanner wel. Omdat deze tijdplakjes zo klein zijn, krijg je de illusie dat de computer meerdere dingen tegelijk doet.

Definitie van Thread

Een thread is een enkele opeenvolgende controlestroom.

Enkele kwalificaties:

  • Een thread is een "pad van uitvoering" door die code.
  • Threads delen geheugen zodat ze moeten samenwerken om het juiste resultaat te bereiken.
  • Een thread heeft thread-specifieke gegevens zoals registers, een stapelaanwijzer en een programmateller.
  • Een proces is een enkele code die veel threads kan hebben, maar er is er minstens één en het heeft een enkele context (adresruimte).
instagram viewer

Dit zijn dingen op assemblageniveau, maar dat is waar je aan begint als je begint na te denken over threads.

Multithreading vs. Multiprocessing

Multithreading is niet hetzelfde als multicore parallelle verwerking, maar multithreading en multiprocessing werken wel samen. De meeste pc's hebben tegenwoordig processors met ten minste twee cores en gewone thuismachines hebben soms wel acht cores. Elke kern is een afzonderlijke processor die in staat is om zelf programma's uit te voeren. U krijgt een prestatieverbetering wanneer het besturingssysteem een ​​ander proces aan verschillende kernen toewijst. Het gebruik van meerdere threads en meerdere processors voor nog betere prestaties wordt parallellisme op threadniveau genoemd.

Veel van wat kan worden gedaan, hangt af van wat het besturingssysteem en de processorhardware kunnen, niet altijd wat u in uw programma kunt doen, en u mag niet verwachten dat u meerdere threads kunt gebruiken alles. In feite vindt u mogelijk niet veel problemen die profiteren van meerdere threads. Implementeer multithreading dus niet alleen omdat het er is. U kunt de prestaties van uw programma gemakkelijk verminderen als het geen goede kandidaat is voor multithreading. Net als voorbeelden zijn videocodecs misschien wel de slechtste programma's om te multithreaden omdat de gegevens inherent zijn serieel. Serverprogramma's die webpagina's verwerken, behoren mogelijk tot de beste omdat de verschillende clients inherent onafhankelijk zijn.

Het oefenen van draadveiligheid

Multithreaded code vereist vaak complexe coördinatie van threads. Subtiele en moeilijk te vinden bugs komen vaak voor omdat verschillende threads vaak dezelfde gegevens moeten delen, zodat gegevens door de ene thread kunnen worden gewijzigd wanneer de andere deze niet verwacht. De algemene term voor dit probleem is 'rasconditie'. Met andere woorden, de twee threads kunnen deelnemen aan een "race" om dezelfde gegevens bij te werken en het resultaat kan verschillen, afhankelijk van welke thread "wint". Stel, als een triviaal voorbeeld, dat u een lus codeert:

Als de lusteller "I" onverwacht het nummer 7 mist en van 6 naar 8 gaat - maar slechts een deel van de tijd - zou dit rampzalige gevolgen hebben voor wat de lus ook doet. Het voorkomen van dit soort problemen wordt thread safety genoemd. Als het programma het resultaat van een bewerking in een latere bewerking nodig heeft, kan het onmogelijk zijn om parallelle processen of threads hiervoor te coderen.

Basisbewerkingen voor multithreading

Het is tijd om dit voorzorgspraatje naar de achtergrond te duwen en wat multithreading-code te schrijven. Dit artikel gebruikt nu een consoletoepassing voor eenvoud. Als u mee wilt doen, start u Visual Studio met een nieuw consoletoepassingsproject.

De primaire naamruimte die wordt gebruikt door multithreading is het systeem. Threading-naamruimte en de Thread-klasse zullen nieuwe threads maken, starten en stoppen. Merk in het onderstaande voorbeeld op dat TestMultiThreading een gedelegeerde is. Dat wil zeggen, u moet de naam gebruiken van een methode die de Thread-methode kan aanroepen.

In deze app hadden we de tweede Sub kunnen uitvoeren door hem eenvoudig te noemen:

Dit zou de hele applicatie in serie hebben uitgevoerd. Het eerste codevoorbeeld hierboven start echter de TestMultiThreading-subroutine en gaat dan verder.

Een recursief algoritme voorbeeld

Hier is een applicatie met meerdere threads waarbij de permutaties van een array worden berekend met behulp van een recursief algoritme. Niet alle code wordt hier weergegeven. De reeks tekens die wordt gepermuteerd is eenvoudigweg "1", "2", "3", "4" en "5." Hier is het relevante deel van de code.

Merk op dat er twee manieren zijn om de Permute-sub aan te roepen (beide zijn in de bovenstaande code besproken). De ene start een thread en de andere noemt het direct. Als je het rechtstreeks noemt, krijg je:

Als u echter een thread start en in plaats daarvan de Permute-sub start, krijgt u:

Dit laat duidelijk zien dat er ten minste één permutatie wordt gegenereerd, dan gaat de hoofdsub verder en eindigt, met de melding "Finished Main", terwijl de rest van de permutaties wordt gegenereerd. Omdat de weergave afkomstig is van een tweede sub die wordt aangeroepen door de Sub-permute, weet je dat dat ook deel uitmaakt van de nieuwe thread. Dit illustreert het concept dat een thread "een pad van uitvoering" is, zoals eerder vermeld.

Voorbeeld race-conditie

Het eerste deel van dit artikel noemde een raceconditie. Hier is een voorbeeld dat het direct laat zien:

Het onmiddellijke venster toonde dit resultaat in één proef. Andere proeven waren anders. Dat is de essentie van een raceconditie.

instagram story viewer