Net, mutex și clasele semafoarelor

Clasa Mutex (excludere reciprocă - excludere reciprocă sau mutex) este una din clasele din .NET Framework, care permite să se asigure sincronizarea între multitudinea de procese. Este foarte similar cu clasa Monitor, care permite, de asemenea, prezența unui singur proprietar. Doar un singur fir poate dobândi de blocare și accesul la zone ale codului mutex sincronizate protejate.

Constructorul de clasa Mutex specifică dacă mutex posedă inițial firul de asteptare, și numele lui. În plus, proiectantul poate furniza informații cu privire la dacă există deja o astfel de clasă.

Mutex este un obiect de ceas se exclud reciproc. Acest lucru înseamnă că poate fi obținută numai prin coada de curgere. Mutex este proiectat pentru acele situații în care resursa partajată pot fi utilizate simultan într-un singur flux. Să presupunem că fișierul jurnal comun de mai multe procese, dar numai una dintre aceste date pot fi înregistrate în acest fișier jurnal în orice moment. Pentru a sincroniza procesele în această situație este mutex ideală.

În Mutex are mai multe constructori. Mai jos sunt două dintre cele mai comune proiectant:

În prima formă a constructorului creează un mutex, care deține inițial nimeni. O a doua formă de fir de apel inițial mutex starea confiscă când parametrul initiallyOwned are o valoare booleană adevărată. În caz contrar, nimeni nu deține mutex.

În scopul de a obține mutex, în codul de program ar trebui sa apel WaitOne metoda () pentru acest mutex. WaitOne () metoda moștenită de la clasa de clasa Mutex Thread.WaitHandle. WaitOne () metoda așteaptă până atunci, până când un mutex pentru care a fost chemat. Prin urmare, această metodă dezactivează executarea firului de asteptare pana cand pana cand acesta devine disponibil pentru a spus mutex. El se întoarce întotdeauna o valoare booleană adevărat.

Atunci când codul nu mai este necesar pentru a menține mutex, este descărcat prin apelarea ReleaseMutex ().

Mecanismul de sincronizare de program urmând exemplul descris mai sus, este demonstrată în practică. În acest program sunt două fluxuri sub formă de clase și IncThread DecThread, care necesită acces la o resursă partajată: SharedRes.Count variabilă. Fluxul IncThread SharedRes.Count variabilă este incrementat, iar DecThread debitului - decrementat. Pentru a evita accesul simultan al ambelor fluxuri de la o resursă partajată SharedRes.Count acest acces este sincronizat mutex Mtx, de asemenea, un membru al clasei SharedRes:

Net, mutex și clasele semafoarelor

Astfel cum rezultă din rezultatele de mai sus, accesul la o resursă partajată (SharedRes.Count variabilă) este sincronizat, prin urmare, valoarea acestei variabile pot fi schimbate simultan într-un singur flux.

Semafor mutex este similară, cu excepția faptului că acesta oferă acces simultan la resursa partajată nu este una, ci mai multe fire. Prin urmare, semaforul este potrivit pentru sincronizarea unui număr de resurse. Semafor controlează accesul la o resursă partajată utilizând contorul pentru acest scop. Dacă valoarea contorului este mai mare decât zero, este permisă atunci accesul la resursa. Dacă această valoare este zero, atunci accesul la resursa este interzisă. Cu contorul sunt numărate numărul de permise. Prin urmare, pentru a avea acces la fluxul de resurse trebuie să obțină o autorizație de la semaforul.

De obicei, un flux care necesită acces la o resursă partajată, încercarea de a obține un permis de semaforul. Dacă valoarea contorului este mai mare decât semaforului zero, atunci fluxul este autorizat, iar contorul este decrementat semafor. În caz contrar, firul este blocat până când, până când el devine permisiune. În cazul în care debitul nu mai este necesară pentru a avea acces la o resursă partajată, acesta eliberează rezoluția, iar contorul este incrementat semafor. Dacă un alt fir așteaptă permisiunea, el devine în acest moment. Numărul simultan este permis accesul specificat la crearea semaforul. De exemplu, dacă creați un semafor, în același timp, permițând doar un singur acces, atunci acest lucru va acționa ca un mutex semafor.

Semafoarelor sunt deosebit de utile în cazurile în care ponderea este compusă dintr-un bazin de grup sau de resurse. De exemplu, fondul de resurse poate consta dintr-un număr de conexiuni de rețea, fiecare dintre care este utilizat pentru transmisia de date. Prin urmare, fluxul care necesită o conexiune la rețea, oricum, ce fel de conexiune pe care le primește. În acest caz, semaforul prevede un mecanism convenabil de gestionare a accesului la conexiuni de rețea.

Semafor este implementat în clasa System.Threading.Semaphore. care are mai multe constructori. Mai jos este cea mai simplă formă a constructorului clasei:

în care initialCount - este valoarea inițială a contra permisiuni semafoarelor, adică Suma Rezoluțiile disponibile inițial; maximumCount - valoarea maximă a contorului, adică, numărul maxim de autorizații care poate da un semafor.

Un semafor este utilizat în același mod ca și mutex descris anterior. Pentru a avea acces la o resursă în codul de program se numește WaitOne () metoda de a semaforului. Această metodă este moștenită din clasa Semafor clasa WaitHandle. WaitOne () metoda așteaptă până până la un semafor pentru care este numit. Astfel, executarea ea blochează firul apelant până când semaforul nu este dat încă permisiunea de a acorda acces la resursa.

În cazul în care codul nu mai este obligat să dețină un semafor, acesta se elibereaza prin apelarea lansării metoda (). Mai jos sunt două forme ale acestei metode:

În prima formă de eliberare () elibereaza metoda doar o singură autorizație, în timp ce a doua formă - numărul de permise definite parametru releaseCount. În ambele forme, această metodă returnează numărul numărului de permise care existau înainte de eliberarea.

În .NET 4 propune două clase cu funcționalitatea unui semafor: Semafor și SemaphoreSlim. clasa Semafor poate fi numit, utilizarea resurselor în cadrul sistemului și pentru a asigura sincronizarea între diferite procese. Clasa SemaphoreSlim Semafor este o versiune simplă a clasei, care este optimizat pentru a oferi cel mai scurt timp de așteptare.