Muteks (od engleskog mutex — Mutual exclusion — uzajamno isključivanje) je vrsta promjenljive u programiranju koja se koristi za sprečavanje istovremenog pristupa različitih niti istom resursu (memoriji, uređajima, itd.).

Problematika uredi

U višenitnom programiranju, čest problem je kako osigurati da više niti može koristiti iste resurse, bez opasnosti da jedna nit ometa pristupanje druge. Tako se može desiti da jedna nit mijenja sadržaj memorijske lokacije dok u isto vrijeme druga nit pokušava da čita taj sadržaj. To može dovesti to učitavanja pogrešnog sadržaja, pogrešnih rezultata i, u krajnjem slučaju, prekida rada programa.

Rješenje u obliku muteksa uredi

 
Ilustracija dviju niti koje pristupaju resursu uz kontrolu pomoću muteksa.

Muteksi imaju ulogu „katanca“. Sve niti se obavezuju da zaključaju katanac (lock) prije nego što pristupe resursu (kaže se da je nit „preuzela vlasništvo“ nad resursom), i da ga otključaju (unlock) po završetku korišćenja. U slučaju da je muteks već zaključan, programsko okruženje stavlja nit „na čekanje“. Kada nit koja već posjeduje resurs završi sa korišćenjem i otključa muteks, programsko okruženje „propušta“ nit koja je na čekanju i predaje joj vlasništvo. Ukoliko ima više niti na čekanju, u zavisnosti od vrste programskog okruženja vlasništvo se predaje niti koja je prva pokušala da preuzme vlasništvo ili se predaje bilo kojoj od niti, metodom nasumičnog izbora.

Problemi sa muteksima uredi

Najčešći problem pri korišćenju muteksa je situacija u kojoj dvije ili više niti čekaju jedna na drugu. Naime, dešava se da jedna nit preuzme vlasništvo nad jednim resursom, a druge nad drugim, a zatim sve pokušavaju da preuzmu vlasništvo nad jednim ili više tuđih resursa. Na taj način svaka od niti čeka da druge otključaju i nastaje trajno stanje čekanja bez razrješenja.

U engleskoj literaturi ovaj slučaj se naziva „dedlok“ (engl. Deadlock). Rješavanje ovakvih situacija je teško i zahtijeva pažljivo planiranje dizajna unaprijed. Tokom rada programa se obično manifestuje blokiranjem rada i potrebno je pokrenuti program ispočetka da bi se sa radom nastavilo.

Podrška u modernim programskim okruženjima uredi

C i C++ uredi

U programskim jezicima C i C++ ne postoji podrška za mutekse, kao ni za niti, nego se ostavlja mogućnost postojanja različitih biblioteka koje ih omogućavaju. U operativnom sistemu juniks (što obuhvata i druge juniksolike sisteme, poput linuksa) to je biblioteka PThread koja nudi interfejs u programskom jeziku C a po Posiksovom standardu. Tip promjenljive koji se u ovoj biblioteci koristi za mutekse je pthread_mutex_t a funkcije koje omogućavaju rad sa muteksima su:

  • pthread_mutex_init za inicijalizovanje muteksa tipa pthread_mutex_t
  • pthread_mutex_lock za zaključavanje
  • pthread_mutex_trylock za zaključavanje bez mogućnosti čekanja u slučaju zauzeća (funkcija se završi sa neuspjehom)
  • pthread_mutex_unlock za otključavanje
  • pthread_mutex_destroy za oslobađanje memorije, tj. „odbacivanje“ muteksa kao promjenljive

Vindouz ima sopstvenu podršku za niti u ovim jezicima u okviru svog sistemskog aplikativnog interfejsa, pa tako i za mutekse. Popularna biblioteka za programski razvoj Qt nudi sopstvene klase QThread i QMutex koje se oslanjaju na odgovarajuće sistemske biblioteke.

Java uredi

Java kao jezik pruža sveobuhvatnu podršku za niti, te kao takva podržava rad i sa muteksima i sa kondicionalnim promjenljivama. U javi, međutim, za mutekse se koristi termin „monitor“ koji je uključen u klasu Object i, stoga, postoji kao ugrađeni atribut u objektu bilo koje klase. Za razliku od drugih interfejsa gdje se kontrola muteksa obavlja korišćenjem eksplicitnih funkcijskih poziva poput „zaključaj“ i „otključaj“, u javi se koristi implicitno zaključavanje korišćenjem ključne riječi synchronized u različitim kontekstima.


Vidi još uredi

Literatura uredi

  • Michel Raynal: Algorithms for Mutual Exclusion, MIT Press, ISBN 0-262-18119-3
  • Sunil R. Das, Pradip K. Srimani: Distributed Mutual Exclusion Algorithms, IEEE Computer Society, ISBN 0-8186-3380-8
  • Thomas W. Christopher, George K. Thiruvathukal: High-Performance Java Platform Computing, Prentice Hall, ISBN 0-13-016164-0
  • Gadi Taubenfeld, Synchronization Algorithms and Concurrent Programming, Pearson/Prentice Hall, ISBN 0-13-197259-6