Se poate calcula un semafor, în timp ce un mutex poate conta doar 1.
Să presupunem că aveți un fir care acceptă conexiuni cu clientul. Acest flux poate procesa simultan 10 clienți. Apoi, fiecare client nou instalează semaforul până când ajunge la 10. Când Semaphore are 10 steaguri, firul dvs. nu va accepta conexiuni noi
Mutexul este de obicei folosit pentru a proteja lucrurile. Să presupunem că cei 10 clienți pot accesa mai multe părți ale sistemului. Apoi, puteți proteja o parte a sistemului cu un mutex, astfel încât atunci când un client este conectat la acest subsistem, nimeni altcineva nu ar trebui să aibă acces. În acest scop, puteți utiliza și Semaphore. Mutexul este Semaporul Mutual.
Din păcate, toată lumea a ratat cea mai importantă diferență dintre un semafor și un mutex; Conceptul de "proprietate".
Semafoarelor nu au nici o noțiune de proprietate, ceea ce înseamnă că orice fir poate elibera semaforul (acest lucru poate duce la multe probleme în sine, dar poate ajuta cu „descoperirea morții“). În timp ce mutex-ul are un concept de proprietate (adică, puteți elibera mutex-ul pe care l-ați cumpărat).
Proprietatea este incredibil de importantă pentru programarea sigură a sistemelor paralele. Întotdeauna recomand să folosiți mutexuri, preferând un semafor (dar există consecințe pentru performanță).
Mutecsi poate sprijini, de asemenea, moștenirea prioritară (care ar putea ajuta la rezolvarea problemei de inversiune prioritate) și recursie (excluzând un singur tip de centralizare).
De asemenea, trebuie remarcat faptul că există semafoare "binare" și semafoare "contoare / generice". Java este un semafor de numărare semaphore și astfel permite sa inițializat cu o valoare mai mare decât unu (în timp ce, după cum este indicat, un mutex poate avea un singur sens conceptual). Utilitatea acestui lucru a indicat și alte posturi.
Deci, pentru a rezuma, dacă nu aveți mai multe resurse pentru a gestiona, întotdeauna am recomanda un mutex peste semafor.
Mutexul este, în principiu, o excludere reciprocă. Numai un fir poate obține imediat resursele. Atunci când un fir primește o resursă, niciun alt fir nu are voie să achiziționeze resursa până când firul care deține resursele este eliberat. Toate firele care așteaptă achiziția resursei vor fi blocate.
Semaforul este folosit pentru a controla numărul de fire executate. Va fi instalat un set fix de resurse. Contul de resurse va scădea de fiecare dată când fluxul deține aceeași valoare. Atunci când numărul semaforului ajunge la 0, nu pot primi alte resurse. Firele sunt blocate până când alte fire au resurse.
Pe scurt, principala diferență constă în faptul că câte fire sunt permise să achiziționeze imediat o resursă?
- Mutex - este ONE.
- Semaphore este DEFINED_COUNT, (precum și numărul de semaphore)
Mutexul este folosit pentru a accesa secvențial resursele, în timp ce semaforul limitează accesul la resurse la un număr specificat. Vă puteți gândi la un semafor mutex cu numărul de acces 1. Nu contează ce ai stabilit pentru semafoarelor dacă fluxurile pentru a accesa resursa înainte de resursa este blocată.
Răspunsul la Feabhas este foarte important - mutexul verifică firul care încearcă să elibereze mutexul, de fapt, proprietarul. Am avut această întrebare de interviu, așa că merită să încercați să-l amintiți.
Obiectul de sincronizare Semaforul realizează lumina clasică. Semaforul monitorizează accesul la resursa partajată de contor. Dacă contorul este mai mare decât zero, este permis accesul; Dacă este zero, accesul este refuzat. Contorul contorizează permisiunile care permit accesul la resursa partajată. Apoi, pentru a accesa resursa, fluxul trebuie să primească permisiunea de la semafor. În general, pentru utilizarea semaforului, un fir care dorește să acceseze o resursă partajată încearcă să obțină permisiunea. Dacă numărul de semafoare este mai mare de zero, fluxul primește permisiunea și numărul de semafoare scade. În caz contrar, firul este blocat până când acesta primește permisiunea. Când firul nu mai are nevoie de acces la cota, acesta eliberează permisiunea, astfel numărul de semafoare crește. Dacă există un alt fir care așteaptă permisiunea, acesta primește permisiunea în acel moment. Clasa Java semafor implementează acest mecanism.
Semaforul are doi asamblori:
num indică contul inițial de activare. Apoi numărul indică numărul de fire care pot accesa resursa partajată la un moment dat. Dacă num este unul, el poate accesa simultan resursele una câte una. Prin stabilirea faptului că este adevărat, puteți să vă asigurați că firele la care vă așteptați au primit permisiunea în ordinea în care au fost solicitate.
Numărarea semaforului. Conceptual, semaforul acceptă un set de permisiuni. Fiecare achiziționează () blochează, dacă este necesar, înainte de a obține permisiunea și apoi o ia. Fiecare lansare () adaugă permisiunea, eventual eliberând cumpărătorul blocant. Cu toate acestea, obiectele de permisiune actuale nu sunt utilizate; Semaforul contează pur și simplu numărul celor disponibile și acționează în consecință.
Semaphorele sunt adesea folosite pentru a limita numărul de fire decât accesarea unor resurse (fizice sau logice)
Java nu are un API Mutex integrat. Dar poate fi implementat ca un semafor binar.
Un semafor, inițializat de unul și folosit pentru a nu avea mai mult de o permisiune disponibilă, poate servi ca o blocare a excluziunii reciproce. Acest lucru este mai cunoscut ca un semafor binar, deoarece are doar două stări: o permisiune este disponibilă sau sunt disponibile rezoluții zero.
Atunci când este utilizat în acest mod are proprietatea binar semafor (spre deosebire de multe încuietori implementări), care „blocare“ pot fi emise de alt flux decât proprietarul (ca semafoarele au conceptul de proprietate). Acest lucru poate fi util în anumite contexte specializate, cum ar fi restabilirea blocajelor.
Deci diferențele cheie între Semaphore și Mutex:
Semaforul limitează numărul de fire pentru accesarea resurselor. Mutex permite unui singur fir să acceseze resursa.
Nici unul dintre subiectele nu are Semaphore. Temele pot actualiza numărul de permisiuni prin apelarea metodelor acquire () și release (). Mutexurile trebuie să fie deblocate numai de firul care ține blocarea.
Când se utilizează un mutex cu variabile de stare, există o bracketing implicită - este clar că partea programului este protejată. Acest lucru nu se aplică neapărat la un semafor, care poate fi chemat să treacă la programarea paralelă - este o modalitate nestructurată, nedefinită, puternică, dar prea ușor de utilizat.