Cunoaște Intuit, curs, streaming

piscină fir

Un bazin fir pentru multithreading simplificare. Programator alocă fragmente de cod (elemente de lucru), care pot fi efectuate în paralel. Scheduler (rulare) distribuie în mod optim elementele de operare de pe piscina firului de lucru. Astfel, încărcarea eficientă număr optim de probleme fluxuri nu sunt un programator, și planificatorul (runtime). Un alt avantaj al aplicării piscinei este de a reduce aeriene asociată cu stabilirea manuală și terminarea fluxurilor pentru fiecare fragment de cod, permițând paralelism. Piscina fir este utilizat pentru a gestiona sarcini Tipul de sarcină. Sarcinile au o serie de mecanisme utile încorporate (stand-by, anula, CV-ul, etc.). Prin urmare, pentru a paralelizare elemente de lucru recomandat să utilizați o sarcină sau șabloane de clasă paralelă. Lucrul direct cu o piscină fără o definiție explicită a sarcinilor poate fi utilă atunci când nu este nevoie de capacități suplimentare de opoziție sarcini.

Metoda este utilizată pentru a adăuga elementul operație

Codul de mai jos ilustrează caracteristicile de bază ale piscinei firului.

Adăugarea la piscina firului 10 elemente de delegați anonime au declarat ca expresie lambda. În elementul de acționare sunt valorile de ieșire ale indicelui i. numărul curent și un semn că debitul este în piscină.

Vă asigurăm că într-adevăr toate elementele de lucru efectuate fluxuri de biliard (IsPoolThread semn este adevărat). În total, tratamentul a implicat doar două fire. Pentru codul dat este posibil ca toate elementele de operare sunt procesate într-un bazin de fir. Toate elementele de operare sunt de ieșire aceleași valori ale indicelui i. 10. Acest lucru se datorează elementelor de lucru asincrone start - fluxul principal continuă să proceseze ciclu și de a crește valoarea indicelui, și de fapt, elemente de lucru nu sunt încă puse în aplicare. Pentru a preveni acest lucru, trebuie să utilizați copiile individuale pentru fiecare element.

Înlocuiți de lucru cu o piscină pe munca manuală cu fluxul:

Afișajul de cod va fi după cum urmează:

Fiecare element de lucru prelucrate în propriul său fir care nu face parte din piscină. Cu indicele am avea din nou probleme, dar ele apar mult mai puțin frecvent și nu atât se manifestă în mod clar - o anumită varietate în producția este încă acolo. Acest lucru se datorează faptului că operațiunea de a adăuga un delegat la rândul său, este mult mai rapid decât initializarea începe un nou fir. În timp ce pe a doua repetare a fluxului este realizată lansarea primului fir este deja setat să funcționeze și să citească valoarea curentă a indicelui. Pentru a asigura funcționarea fiecărui flux cu un cod unic, ar trebui să utilizeze copii ale indicilor, care sunt create pentru fiecare iterație:

Principalul dezavantaj de a lucra cu un bazin, este lipsa de finalizare mecanism așteptări de elemente de lucru. Trebuie să fie utilizați unele mijloace de sincronizare (de exemplu, mesaje de semnalizare. ManualResetEvent model de sincronizare CountdownEvent), sau variabile partajate.

Funcțiile de operare sunt transferate în mesajul de alarmă. Firul principal blocat de așteptare pentru semnalul. fluxul de lucru după finalizarea generează un semnal. În cazul fire multiple, puteți utiliza o serie de mesaje și metoda WaitHandle.WaitAll de așteptare pentru semnale de la toate fluxurile.

Fiecare element de operare funcționează cu propriul său obiect unic de semnal. După finalizare, obiectul delegat set de semnal. Fluxul principal de așteptare pentru finalizarea tuturor elementelor de lucru.

  1. Care sunt avantajele în care lucrează direct cu fluxul?
  2. Care sunt principalele probleme de organizare a multi-threading?
  3. În unele cazuri, lucrează cu un bazin de fire este mai eficientă decât munca directă cu fluxul?

exerciții

Punerea în aplicare a unui bazin de fir personalizat care reproduce funcțiile obiectului ThreadPool. Adăugați un nou grup de metode care fac mai ușor de a lucra și de a face contact cu un bazin de mai informativ. De exemplu, metodele de așteptare de funcționare sarcini; informații de sinteză privind sarcinile (numărul de fire implicate în procesarea, timpul de tratament).