VB.NET-kierteityksen ymmärtäminen auttaa ymmärtämään joitain perustakonsepteja. Ensinnäkin, että säiettäminen tapahtuu, koska käyttöjärjestelmä tukee sitä. Microsoft Windows on ennalta ehkäisevä monitehtäväinen käyttöjärjestelmä. Osa Windowsista, nimeltään tehtäväaikataulu, vie prosessorin ajan kaikkiin käynnissä oleviin ohjelmiin. Näitä prosessorin ajan pieniä palasia kutsutaan aikaleikkeiksi. Ohjelmat eivät ole vastuussa siitä, kuinka paljon prosessorin aikaa he saavat, tehtävien aikataulu on. Koska nämä aikavälit ovat niin pieniä, saat illuusion, että tietokone tekee useita asioita kerralla.
Määritelmä lanka
Lanka on yksi peräkkäinen ohjausvirta.
Jotkut karsinnat:
- Lanka on "toteutuspolku" kyseisen koodin läpi.
- Langat jakavat muistia, joten heidän on tehtävä yhteistyötä oikean tuloksen tuottamiseksi.
- Lanka sisältää säiekohtaiset tiedot, kuten rekisterit, pinoosoittimen ja ohjelmalaskurin.
- Prosessi on yksi kokonainen koodikoko, jolla voi olla useita ketjuja, mutta siinä on ainakin yksi ja sillä on yksi konteksti (osoitetila).
Tämä on kokoonpanotason tavaraa, mutta siihen joudut, kun alat ajatella lankoja.
Monisäikeinen vs. multiprocessing
säikeistystekniikkaa ei ole sama kuin monisäikeinen rinnakkaiskäsittely, mutta monisäikeinen ja moniprosessointi toimivat yhdessä. Useimmissa tietokoneissa on nykyään prosessoreita, joissa on vähintään kaksi ydintä, ja tavallisissa kotikoneissa on joskus jopa kahdeksan ydintä. Jokainen ydin on erillinen suoritin, joka pystyy suorittamaan ohjelmia itsessään. Saat suorituskyvyn parannuksen, kun käyttöjärjestelmä määrittää eri prosessien eri ytimille. Useiden ketjujen ja useiden prosessorien käyttämistä vielä parempaan suorituskykyyn kutsutaan langatason rinnakkaisuudeksi.
Paljon mitä voidaan tehdä riippuu siitä, mitä käyttöjärjestelmä ja prosessorin laitteistot voivat tehdä, ei aina mitä voit tehdä ohjelmassasi, ja sinun ei pitäisi odottaa pystyvänsi käyttämään useita säikeitä kaikki. Itse asiassa et ehkä löydä monia ongelmia, jotka hyötyvät useista säikeistä. Joten älä ota käyttöön monisäikeistä vain siksi, että se on olemassa. Voit helposti vähentää ohjelman suorituskykyä, jos se ei ole hyvä ehdokas monisäikeisiin. Aivan kuten esimerkkejä, videokoodekit voivat olla pahimpia ohjelmia monisäikeisiin, koska tiedot ovat luonnostaan luonteeltaan sarja. Verkkosivuja käsittelevät palvelinohjelmat voivat olla parhaimpia, koska eri asiakkaat ovat luonnostaan itsenäisiä.
Kierteiden turvallisuuden harjoittelu
Monisäikeinen koodi vaatii usein ketjujen monimutkaista koordinointia. Hienovaraiset ja vaikeasti löydettävät virheet ovat yleisiä, koska eri ketjujen on usein jaettava sama tieto, jotta tietoja voidaan muuttaa yhdellä säikeellä, kun toinen ei odota sitä. Yleinen termi tähän ongelmaan on "rodun tila". Toisin sanoen, kaksi säiettä voi päästä "kilpailuun" päivittääksesi saman datan, ja tulos voi olla erilainen riippuen siitä, mikä säie "voittaa". Oletetaan, että koodaat silmukkaa:
Jos silmukkalaskuri "I" odottamatta ohittaa numeron 7 ja siirtyy numerosta 6-8 - mutta vain jonkin aikaa -, sillä olisi tuhoisat vaikutukset mihin tahansa silmukka tekee. Tämänkaltaisten ongelmien estämistä kutsutaan langan turvallisuudeksi. Jos ohjelma tarvitsee yhden operaation tuloksen myöhemmässä operaatiossa, niin voi olla mahdotonta koodata rinnakkaisprosesseja tai säikeitä sen tekemiseen.
Monisäikeiset perusoperaatiot
On aika viedä tämä varovainen keskustelu taustaan ja kirjoittaa monisäikeinen koodi. Tässä artikkelissa käytetään konsolin sovellusta yksinkertaisuuden vuoksi. Jos haluat seurata, aloita Visual Studio uudella konsolihakemusprojektilla.
Ensisijainen nimitila, jota monisäikeinen käyttö on, on Järjestelmä. Kierteen nimitila ja säieluokka luovat, alkavat ja lopettavat uudet ketjut. Seuraavassa esimerkissä huomaa, että TestMultiThreading on edustaja. Toisin sanoen sinun on käytettävä menetelmän nimeä, jota säiemenetelmä voi kutsua.
Tässä sovelluksessa olisimme voineet suorittaa toisen osan yksinkertaisesti kutsumalla sitä:
Tämä olisi suorittanut koko sovelluksen sarjamuodolla. Ensimmäinen yllä oleva koodiesimerkki kuitenkin käynnistää TestMultiThreading-aliohjelman ja jatkaa sitten.
Rekursiivinen algoritmi-esimerkki
Tässä on monisäikeinen sovellus, joka sisältää taulukon permutaatioiden laskemisen rekursiivisella algoritmilla. Kaikkia koodeja ei näytetä tässä. Permutoitavien merkkien joukko on yksinkertaisesti "1", "2", "3", "4" ja "5." Tässä on asianmukainen osa koodia.
Huomaa, että Permute-alasoittoon voidaan soittaa kahdella tavalla (molemmat kommentoidaan yllä olevaan koodiin). Yksi aloittaa langan ja toinen soittaa sen suoraan. Jos soitat suoraan, saat:
Jos kuitenkin aloitat langan ja käynnistät sen sijaan Permute-ali, saat:
Tämä osoittaa selvästi, että ainakin yksi permutaatio muodostetaan, sitten Main-ala siirtyy eteenpäin ja päättyy, näyttöön tulee "Valmiina pää", kun taas loput permutaatiot generoidaan. Koska näyttö tulee toisesta alaluettelosta, jota kutsuu Permute-alaosa, tiedät, että se on myös osa uutta säiettä. Tämä havainnollistaa käsitettä, että säie on "toteuttamispolku", kuten aiemmin mainittiin.
Esimerkki rotuolosuhteista
Tämän artikkelin ensimmäisessä osassa mainittiin rotuolosuhteet. Tässä on esimerkki, joka osoittaa sen suoraan:
Välitön ikkuna osoitti tämän tuloksen yhdessä kokeessa. Muut kokeet olivat erilaisia. Se on kisaolosuhteiden ydin.