Tråd introduktion i Visual Basic

For at forstå trådning i VB.NET hjælper det med at forstå nogle af fundamentkoncepterne. Først og fremmest er, at trådning er noget, der sker, fordi operativsystemet understøtter det. Microsoft Windows er et forebyggende operativsystem med flere opgaver. En del af Windows kaldet opgaveskedleren pakker processortid ud til alle de kørende programmer. Disse små bidder af processortid kaldes tidsskiver. Programmer er ikke ansvarlige for, hvor meget processor tid de får, opgaveplanlæggeren er. Fordi disse tidsskiver er så små, får du en illusion om, at computeren gør flere ting på én gang.

Definition af tråd

En tråd er en enkelt sekventiel strøm af kontrol.

Nogle kvalifikationer:

  • En tråd er en "eksekveringssti" gennem denne kropsdel.
  • Tråde deler hukommelse, så de er nødt til at samarbejde for at producere det rigtige resultat.
  • En tråd har trådspecifikke data, såsom registre, en stakpeger og en programtæller.
  • En proces er en enkelt kropsdel, der kan have mange tråde, men den har mindst en, og den har en enkelt kontekst (adresserum).
instagram viewer

Dette er ting på monteringsniveau, men det er hvad du kommer ind i, når du begynder at tænke på tråde.

Multithreading vs. multiprocessing

multithreading er ikke det samme som multicore parallelbehandling, men multithreading og multiprocessing fungerer sammen. De fleste pc'er i dag har processorer, der har mindst to kerner, og almindelige hjemmemaskiner har undertiden op til otte kerner. Hver kerne er en separat processor, der er i stand til at køre programmer af sig selv. Du får et ydeevne boost, når OS tildeler en anden proces til forskellige kerner. Brug af flere tråde og flere processorer til endnu større ydelse kaldes trådniveau parallelitet.

Meget af hvad der kan gøres afhænger af, hvad operativsystemet og processorhardwaren kan gøre, ikke altid hvad du kan gøre i dit program, og du bør ikke forvente at være i stand til at bruge flere tråde på alt. Faktisk finder du muligvis ikke mange problemer, der drager fordel af flere tråde. Så implementer ikke multithreading bare fordi det er der. Du kan nemt reducere dit programs ydeevne, hvis det ikke er en god kandidat til multithreading. Ligesom som eksempler kan videokodeker være de værste programmer, der skal multitrær, fordi dataene i sagens natur er seriel. Serverprogrammer, der håndterer websider, er måske blandt de bedste, fordi de forskellige klienter i sagens natur er uafhængige.

Øvelse af gevindsikkerhed

Multitrådet kode kræver ofte kompleks koordinering af tråde. Subtile og vanskelige at finde bugs er almindelige, fordi forskellige tråde ofte skal dele de samme data, så data kan ændres med en tråd, når en anden ikke forventer det. Det generelle udtryk for dette problem er "race-tilstand". Med andre ord kan de to tråde komme ind i et "race" for at opdatere de samme data, og resultatet kan være anderledes afhængigt af hvilken tråd "der vinder". Antag, at du koder en løkke som et trivielt eksempel:

Hvis looptælleren "I" uventet går glip af nummeret 7 og går fra 6 til 8 - men kun noget af tiden - ville det have katastrofale effekter på, hvad loopen gør. Forebyggelse af problemer som dette kaldes gevindssikkerhed. Hvis programmet har brug for resultatet af en operation i en senere operation, kan det være umuligt at kode parallelle processer eller tråde for at gøre det.

Grundlæggende multithreading operationer

Det er tid til at skubbe denne forebyggende tale til baggrunden og skrive nogle multithreading-koder. Denne artikel bruger en konsoleapplikation for enkelhed lige nu. Hvis du vil følge med, skal du starte Visual Studio med et nyt Console Application-projekt.

Det primære navneområde, der bruges af multithreading, er systemet. Trådning af navneområde og trådklassen opretter, starter og stopper nye tråde. I eksemplet nedenfor skal du bemærke, at TestMultiThreading er en delegeret. Det vil sige, at du skal bruge navnet på en metode, som trådmetoden kan kalde.

I denne app kunne vi have udført den anden Sub ved blot at kalde den:

Dette ville have udført hele applikationen serielt. Det første kodeeksempel ovenfor starter imidlertid TestMultiThreading-underprogrammet og fortsætter derefter.

Et rekursivt algoritmeeksempel

Her er en multithreaded applikation, der involverer beregning af permutationer af en matrix ved hjælp af en rekursiv algoritme. Ikke alle koder vises her. Matrixen af ​​karakterer, der permuteres, er simpelthen "1," "2," "3," "4," og "5." Her er den relevante del af koden.

Bemærk, at der er to måder at kalde under-tilladelsen under (begge kommenteres i koden ovenfor). Den ene sparker af en tråd, og den anden kalder den direkte. Hvis du kalder det direkte, får du:

Men hvis du sparker i gang en tråd og starter Subute-tilladelsen i stedet, får du:

Dette viser tydeligt, at der genereres mindst en permutation, hvorefter Main-sub'en bevæger sig foran og afsluttes og viser "Finished Main", mens resten af ​​permutationerne genereres. Da displayet kommer fra en anden sub, der kaldes af Permute-sub, ved du, at det også er en del af den nye tråd. Dette illustrerer konceptet om, at en tråd er "en udførelsesvej" som tidligere nævnt.

Eksempel på racetilstand

Den første del af denne artikel nævnte en løbstilstand. Her er et eksempel, der viser det direkte:

Det umiddelbare vindue viste dette resultat i en prøve. Andre forsøg var forskellige. Det er essensen af ​​en racetilstand.

instagram story viewer