Da biste razumjeli navoje u VB.NET-u, pomaže vam razumjeti neke od temeljnih koncepata. Prvo je da se navojem nešto događa jer ga operativni sustav podržava. Microsoft Windows je prevladavajući operativni sustav za više zadataka. Dio sustava Windows nazvan planer zadataka otprema procesorsko vrijeme svim pokretanim programima. Ovi mali dijelovi vremena procesora nazivaju se odsječci vremena. Programi nisu odgovorni za vrijeme procesa, koliko je vremena za planiranje. Budući da su ovi vremenski odsječci toliko mali, dobivate iluziju da računalo radi nekoliko stvari odjednom.
Definicija niti
Navoj je jedan uzastopni tijek upravljanja.
Neki kvalifikatori:
- Konac je "put izvršenja" kroz to tijelo koda.
- Niti dijele memoriju pa moraju surađivati kako bi postigli točan rezultat.
- Nit ima podatke specifične za nit, poput registara, pokazivača snopa i brojača programa.
- Proces je jedno tijelo koda koje može imati više niti, ali ima barem jedan i ima jedan kontekst (adresni prostor).
To su stvari na razini montaže, ali to je ono što uđete kad počnete razmišljati o nitima.
Multithreading vs. višeobradbeni
višedretvenost nije isto što i višestruka paralelna obrada, ali multithreading i multiprocessing rade zajedno. Većina PC-ova danas ima procesore koji imaju najmanje dvije jezgre, a obični kućni strojevi ponekad imaju i do osam jezgara. Svaka jezgra je zaseban procesor, sposoban sam pokrenuti programe. Povećavate performanse kada OS dodjeljuje različit proces različitim jezgrama. Upotreba više niti i više procesora za još veće performanse naziva se paralelizam na razini niti.
Mnogo toga što se može ovisiti o tome što operativni sustav i hardver procesora mogu učiniti, a ne uvijek ono što možete učiniti u svom programu, i ne biste trebali očekivati da ćete moći koristiti više niti sve. Zapravo možda nećete naći mnogo problema koji imaju koristi od više niti. Dakle, nemojte implementirati multithreading samo zato što je tamo. Možete jednostavno smanjiti performanse vašeg programa ako nije dobar kandidat za multithreading. Kao primjeri, video kodeci mogu biti najgori programi za višestruko čitanje jer su podaci inherentni serijski. Programi poslužitelja koji obrađuju web stranice mogli bi biti među najboljima jer su različiti klijenti sami po sebi neovisni.
Vježbanje sigurnosti navoja
Multithreaded koda često zahtijeva složenu koordinaciju niti. Suptilni i teško pronađeni bugovi su uobičajeni jer različiti niti često moraju dijeliti iste podatke kako bi se jedan podatak mogao promijeniti ako drugi to ne očekuje. Opći je pojam za ovaj problem "stanje utrke". Drugim riječima, dvije niti mogu ući u „utrku“ radi ažuriranja istih podataka, a rezultat može biti različit, ovisno o tome koja nit „pobjeđuje“. Kao trivijalni primjer, pretpostavimo da kodirate petlju:
Ako brojač petlje "I" neočekivano propusti broj 7 i krene sa 6 do 8, ali samo u nekim slučajevima, to bi imalo katastrofalne učinke na sve što petlja radi. Sprječavanje takvih problema naziva se sigurnost navoja. Ako je programu potreban rezultat jedne operacije u kasnijoj operaciji, tada može biti nemoguće kodirati paralelne procese ili niti kako bi ih izveo.
Osnovne operacije s višestrukim navojem
Vrijeme je da ovaj razgovor iz predostrožnosti gurnete u pozadinu i napišete neki višenamjenski kôd. Ovaj članak trenutno koristi jednostavnu aplikaciju za jednostavnost. Ako želite slijediti dalje, pokrenite Visual Studio s novim projektom Konzole aplikacije.
Primarni prostor imena koji koristi multithreading je Sustav. Prostor imena i klasa Thread stvorit će, pokretati i zaustavljati nove teme. U primjeru u nastavku primijetite da je TestMultiThreading delegat. Odnosno, morate koristiti ime metode koja metoda Thread može pozvati.
U ovoj bismo aplikaciji mogli izvršiti drugi Sub, tako da ga jednostavno nazovemo:
Ovo bi čitavu aplikaciju izvršilo serijski. Prvi gornji primjer koda, međutim, pokreće potprogram TestMultiThreading, a zatim nastavlja.
Primjer rekurzivnog algoritma
Slijedi višeslojna aplikacija koja uključuje izračunavanje permutacija niza pomoću rekurzivnog algoritma. Ovdje nije prikazan sav kod. Niz prožimanja znakova jednostavno je "1", "2", "3", "4" i "5." Evo relevantnog dijela koda.
Imajte na umu da postoje dva načina za pozivanje Permute potpoglavlja (oba su komentirana u gornjem kodu). Jedan započinje nit, a drugi izravno poziva. Ako ga direktno nazovete, dobivate:
Međutim, ako otvorite nit i umjesto toga pokrenete potporanj Permute, dobit ćete:
To jasno pokazuje da se generira najmanje jedna permutacija, a zatim se glavni potkrepa naprijed i dovršava, prikazujući "Finished Main", dok se ostale permutacije generiraju. Budući da zaslon dolazi iz drugog potpoglavlja nazvanog potporom Permute, znate da je i to dio nove niti. Ovo ilustrira koncept da je nit "put izvršenja" kao što je spomenuto ranije.
Primjer uvjeta utrke
Prvi dio ovog članka spomenuo je stanje utrke. Evo primjera koji to izravno pokazuje:
Neposredni prozor pokazao je ovaj rezultat u jednom pokusu. Ostala su ispitivanja bila različita. To je suština stanja utrke.