Un mutex este un mecanism de excludere mutual (MUTual EXclusion) utilizat pentru protectia structurilor de date partajate de la modificari concurente. Un mutex poate avea doua stari: locked sau unlocked. Daca un thread incearca sa inchida un mutex care a fost deja inchis de un alt thread atunci se va suspenda executia pana la eliberarea thread-ului.
Functiile de lucru cu mutex-uri sunt:
#include <pthread.h> int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex- attr_t *mutexattr); int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_trylock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex); int pthread_mutex_destroy(pthread_mutex_t *mutex);
pthread_mutex_init este folosita pentru initializarea unui mutex conform cu atributele specificate; in locul atributelor se va folosi NULL pentru atributele implicite
pthread_mutex_lock este folosit pentru a inchide mutex-ul respectiv; daca mutex-ul nu este inchis, atunci thread-ul curent devine detinatorul mutex-ului si il inchide; altfel se suspenda executia thread-ului curent pana la eliberarea mutex-ului
pthread_mutex_trylock se comporta la fel ca pthread_mutex_lock doar ca nu blocheaza thread-ul curent; daca mutex-ul este deja inchis de un alt thread se intoarce cu un cod de eroare EBUSY
pthread_mutex_unlock deblocheaza mutex-ul curent; se asteapta ca mutex-ul sa fie ocupat in momentul eliberarii
pthread_mutex_destroy distruge obiectul mutex, eliberand resursele pe care acesta le-ar putea detine
De sine statoare, mutex-urile pot fi folosite numai pentru asigurarea excluderii mutuale; pentru probleme asemanatoare acestea sunt insuficiente. De accea se vor folosi impreuna cu variabilele conditie, pentru a crea mecanismul de monitor, structura extrem de utila si de flexibila pentru rezolvarea problemelor de sincronizare.