Razumijevanje spremišta niti u C #

Nit je najmanja izvršna jedinica u procesu. Spremište niti sastoji se od određenog broja niti, točnije, od skupa niti, a može se koristiti za obavljanje nekoliko aktivnosti u pozadini.

Zašto bih trebao koristiti spremišta niti?

Teme su skupe jer troše puno resursa u vašem sustavu za inicijalizaciju, prebacivanje konteksta i oslobađanje resursa koje zauzimaju. Obično, kada nit izvodi I / O operaciju (rukovanje datotekama, operacija baze podataka ili pristup mrežnim resursima, itd.), Operativni sustav nit blokira sve dok I / O operacija ne završi. Nit će nastaviti s radom CPU-a nakon završetka I / O rada.

Spremište niti dobar je izbor kada želite ograničiti broj niti koje su pokrenute u određenom trenutku i želite izbjeći općenite troškove stvaranja i uništavanja niti u vašoj aplikaciji. Dobar je izbor i kada u svojoj aplikaciji imate mnogo zadataka koje treba izvršavati paralelno ili istodobno, a želite poboljšati reaktivnost aplikacije izbjegavanjem prebacivanja konteksta. Da biste stvorili spremište niti, možete iskoristiti klasu System.Threading.ThreadPool.

Sljedeći isječak koda pokazuje kako možete postaviti minimalni broj niti u spremištu niti.

ThreadPool.SetMinThreads (50, 50);

Međutim, imajte na umu da kada se izvršava dugotrajni zadatak, nit spremišta niti može biti blokiran dulje vrijeme. Da stvar bude gora, dolazni zahtjevi koji ovise o nitima iz spremišta niti mogu biti na čekanju ili čak mogu biti odbijeni prvenstveno zato što spremište niti možda neće imati dostupne niti s kojima može obraditi dolazni zahtjev. Spremište niti također nije dobar izbor kada imate niti koje se razlikuju po prioritetima ili ćete možda morati prerano prekinuti nit. Prijevremeni završetak navoja podrazumijeva da je navoj zaustavljen na silu prije nego što završi vrijeme obrade.

Kako funkcionira spremište niti?

U osnovi, kada radite s spremištima niti, obično biste stvorili kolekciju niti i spremili ih u spremište niti prije nego što upotrijebite niti u svojoj aplikaciji. Kao i kada vam treba nit, više ćete ih upotrebljavati, a ne stvarati nove niti svaki put kad aplikacija treba koristiti nit.

Dakle, aplikacija će uputiti zahtjev u spremište niti da iz njega dobije nit, izvoditi aktivnosti pomoću niti, a zatim vraća nit natrag u spremište niti kada završi. Skupine niti korisne su u situacijama kada morate izvršiti više zadataka nego što možete stvoriti niti (postoji ograničenje maksimalnog broja niti koje možete stvoriti po procesu) u svojoj aplikaciji.

Kako mogu optimizirati spremište niti?

Kada proces započne, CLR mu dodjeljuje skup niti. Imajte na umu da možete konfigurirati veličinu spremišta niti ako trebate. Izvršenje inteligentno upravlja spremištem niti. Kada se spremište niti pokrene, u spremištu niti nalazi se samo jedna nit. Od tada upravitelj spremišta niti (komponenta odgovorna za upravljanje spremištem niti) stvara više niti i pohranjuje ih u spremište niti kako se povećava opterećenje aplikacije, tj. Aplikaciji treba sve više i više zadataka koji se istodobno izvršavaju.

Broj niti koje mogu biti dostupne u spremištu niti u bilo kojem trenutku ovisi o najvećoj dopuštenoj granici niti u spremištu niti. Drugim riječima, broj dostupnih niti u spremištu niti razlikuje se s vremena na vrijeme, ovisno o potrošnji niti u aplikaciji. Čim se dosegne maksimalno ograničenje (maksimalan broj niti u spremištu niti), aplikacija stvara mnogo rjeđe nove niti.

Ako je potrebno, uvijek možete sami postaviti gornju granicu dopuštenih niti u spremištu niti. Da biste to učinili, trebali biste iskoristiti svojstvo ThreadPool.SetMaxThreads. Da biste postavili donju granicu niti u spremištu niti, možete koristiti svojstvo ThreadPool.SetMinThreads. Zadana donja granica broja niti u spremištu niti je jedna nit po procesoru.