A VB.NET szálainak megértése segít megérteni néhány alapfogalmat. Először is az, hogy a szálakba helyezés történik, mert az operációs rendszer támogatja. A Microsoft Windows egy megelőző multitasking operációs rendszer. A Windows egy része, amelyet a feladatütemezőnek hívnak, a processzor idejét kiszámítja az összes futó programra. Ezeket a kis processzor-darabokat időszeleteknek nevezzük. A programok nem felelnek a processzor időtartamáért, azaz a feladatütemező. Mivel ezek az időszeletek olyan kicsik, akkor az az illúzió jön létre, hogy a számítógép több dolgot csinál egyszerre.
A szál meghatározása
A szál egyetlen vezérlő sorozatáram.
Néhány selejtező:
- A szál egy "végrehajtás útja" ezen a kódrészen keresztül.
- A szálak megosztják a memóriát, így együtt kell működniük a helyes eredmény elérése érdekében.
- A szál szálszál-specifikus adatokkal rendelkezik, például regiszterekkel, veremmutatóval és programszámlálóval.
- A folyamat egyetlen kódrészlet, amelyben sok szál lehet, de legalább egy van, és egyetlen kontextussal rendelkezik (címtér).
Ez összeszerelési szintű cucc, de erre kerül akkor, amikor elkezdesz gondolkodni a szálakra.
Többszálú vs. multiprocessing
A többszálas nem ugyanaz, mint a többmagos párhuzamos feldolgozás, de a többszálú és a többprocesszáló működnek együtt. A legtöbb PC ma olyan processzorokkal rendelkezik, amelyek legalább két magot tartalmaznak, és a szokásos otthoni gépek néha akár nyolc magot is tartalmaznak. Minden mag külön processzor, amely önmagában képes programok futtatására. A teljesítménynövekedést akkor kapja meg, amikor az operációs rendszer eltérő folyamatot rendel a különböző magokhoz. Több szál és több processzor használatát a még nagyobb teljesítmény érdekében szálszintű párhuzamosságnak nevezzük.
Sok teendő attól függ, hogy az operációs rendszer és a processzor hardverei mit tudnak csinálni, nem mindig azt, amit megtehetsz a programjában, és nem szabad számítania arra, hogy több szálat is képes használni minden. Valójában előfordulhat, hogy nem talál sok olyan problémát, amelyek több szálból származnak. Tehát ne hajtsa végre a többszálú alkalmazást csak azért, mert ott van. Könnyedén csökkentheti a program teljesítményét, ha nem alkalmas többszálú szálak felhasználására. Csakúgy, mint példa, a video kodekek lehetnek a legrosszabb programok a többszálú, mert az adatok eredendőek sorozatszám. Lehet, hogy a weblapokat kezelő szerverprogramok a legjobbak közé tartoznak, mivel a különböző ügyfelek eredendően függetlenek.
A szálbiztonság gyakorlása
A többszálú kód gyakran a szálak komplex koordinációját igényli. A finom és nehezen megtalálható hibák gyakoriak, mivel a különféle szálaknak gyakran ugyanazt az adatot kell megosztaniuk, így az adatok megváltoztathatók egyik szálakkal, amikor egy másik nem számít rá. A probléma általános kifejezése a "versenyfeltétel". Más szavakkal, a két szál „versenybe” kerülhet ugyanazon adatok frissítése céljából, és az eredmény eltérő lehet attól függően, hogy melyik szál „nyer”. Például tegyük fel, hogy hurkot kódolsz:
Ha az „I” hurokszámláló váratlanul elmulasztja a 7-es számot, és 6-ról 8-ra megy - de csak időnként -, katasztrofális következményekkel járna bármi, amit a hurok csinál. Az ilyen problémák megelőzését menetbiztonságnak nevezzük. Ha a programnak szüksége van egy művelet eredményére egy későbbi művelet során, akkor lehetetlen lehet párhuzamos folyamatok vagy szálak kódolása ehhez.
Alapvető többszálú műveletek
Ideje ezt az elővigyázatossági beszélgetést a háttérbe szorítani, és írni egy többszálú kódot. Ez a cikk jelenleg az Console alkalmazást használja az egyszerűség kedvéért. Ha szeretné követni, indítsa el a Visual Studio alkalmazást egy új konzol alkalmazás projekttel.
A többszálak által használt elsődleges névtér a rendszer. A szálak névtere és a Téma osztály új szálakat hoz létre, indít és leállít. Az alábbi példában vegye figyelembe, hogy a TestMultiThreading megbízott. Vagyis olyan módszer nevét kell használnia, amelyet a szál módszer meghívhat.
Ebben az alkalmazásban a második alfejezetet végrehajthattuk volna, ha egyszerűen meghívtuk volna:
Ez a teljes alkalmazást soros módon végrehajtotta volna. A fenti első példa azonban elindítja a TestMultiThreading alprogramot, majd folytatja.
Rekurzív algoritmus példa
Itt található egy többszálú alkalmazás, amely magában foglalja egy tömb permutációinak kiszámítását egy rekurzív algoritmus segítségével. Nem az összes kód jelenik meg itt. A permutálható karakterek tömege egyszerűen "1", "2", "3", "4" és "5". Itt van a kód releváns része.
Vegye figyelembe, hogy a Permute alcsoport meghívására kétféle mód van (mindkettőt a fenti kód kommentálta). Az egyik elindít egy szálat, a másik pedig közvetlenül hívja. Ha közvetlenül hívja, akkor kap:
Ha azonban elindít egy szálat és elindítja a Permute alpontot, akkor a következőt kapja:
Ez egyértelműen azt mutatja, hogy legalább egy permutáció generálódik, majd a Main sub elmozdul és befejeződik, megjelenítve a "Kész Main", míg a többi permutáció generálódik. Mivel a kijelző a Permute alsó rész által hívott második alból származik, tudod, hogy ez az új szál része is. Ez szemlélteti azt az elképzelést, miszerint egy szál "végrehajtás útja", amint azt korábban már említettük.
Példa a versenyfeltételekre
A cikk első része megemlítette a verseny feltételeit. Íme egy példa, amely azt közvetlenül mutatja:
Azonnali ablak ezt az eredményt egy próba során megmutatta. Más kísérletek eltérőek voltak. Ez a versenyfeltétel lényege.