pthread_mutex_init(3) Library Functions Manual pthread_mutex_init(3) NUME pthread_mutex_init, pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_unlock, pthread_mutex_destroy - operaii asupra mutex-urilor SINOPSIS #include pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; pthread_mutex_t errchkmutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_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); DESCRIERE Un mutex este un dispozitiv de EXCLUDERE MUTUALA ,,MUTual EXclusion" i este util pentru protejarea structurilor de date partajate impotriva modificarilor simultane i pentru implementarea seciunilor critice i a monitorizarilor. Un mutex are doua stari posibile: deblocat (nu este deinut de niciun fir) i blocat (este deinut de un singur fir). Un mutex nu poate fi niciodata deinut simultan de doua fire diferite. Un fir care incearca sa blocheze un mutex care este deja blocat de un alt fir este suspendat pana cand firul proprietar deblocheaza primul mutex. pthread_mutex_init() iniializeaza obiectul mutex indicat de mutex in conformitate cu atributele mutex specificate in mutexattr. In cazul in care mutexattr este NULL, se utilizeaza in schimb atributele implicite. Implementarea LinuxThreads accepta doar un singur atribut mutex, mutex kind, care este fie ,,fast", ,,recursive", fie ,,error checking". Tipul unui mutex determina daca acesta poate fi blocat din nou de un fir care il deine deja. Tipul implicit este ,,fast". A se vedea pthread_mutexattr_init(3) pentru mai multe informaii despre atributele mutex-urilor. Variabilele de tip pthread_mutex_t pot fi, de asemenea, iniializate static, utilizand constantele PTHREAD_MUTEX_INITIALIZER (pentru mutex-uri rapide), PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP (pentru mutex-uri recursive) i PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP (pentru mutex-uri de verificare a erorilor). pthread_mutex_lock() blocheaza mutex-ul dat. Daca mutex-ul este in prezent deblocat, acesta devine blocat i este deinut de firul apelant, iar pthread_mutex_lock() returneaza imediat. Daca mutex-ul este deja blocat de un alt fir de execuie, pthread_mutex_lock() suspenda firul apelant pana cand mutex-ul este deblocat. In cazul in care mutex-ul este deja blocat de firul apelant, comportamentul lui pthread_mutex_lock() depinde de tipul mutex-ului. In cazul in care mutex-ul este de tipul ,,fast", firul apelant este suspendat pana cand mutex-ul este deblocat, ceea ce duce efectiv la blocarea firului apelant. In cazul in care mutex-ul este de tipul ,,error checking", pthread_mutex_lock returneaza imediat cu codul de eroare EDEADLK. In cazul in care mutex-ul este de tip ,,recursive", pthread_mutex_lock() reuete i returneaza imediat, inregistrand numarul de blocari ale mutex-ului de catre firul apelant. Un numar egal de operaii pthread_mutex_unlock() trebuie efectuate inainte ca mutex-ul sa revina la starea deblocata. pthread_mutex_trylock() se comporta in mod identic cu pthread_mutex_lock(), cu excepia faptului ca nu blocheaza firul apelant daca mutex-ul este deja blocat de un alt fir (sau de firul apelant in cazul unui mutex ,,fast"). In schimb, pthread_mutex_trylock() returneaza imediat cu codul de eroare EBUSY. pthread_mutex_unlock() deblocheaza mutex-ul dat. Se presupune ca mutex-ul este blocat i deinut de firul apelant la intrarea in pthread_mutex_unlock(). In cazul in care mutex-ul este de tip ,,fast", pthread_mutex_unlock() il readuce intotdeauna in starea deblocata. In cazul in care este de tip ,,recursive", descrete numarul de blocaje ale mutex-ului (numarul de operaii pthread_mutex_lock() efectuate asupra acestuia de catre firul apelant) i numai atunci cand acest numar ajunge la zero, mutex-ul este efectiv deblocat. In cazul mutex-urilor ,,error checking" i ,,recursive", pthread_mutex_unlock() verifica de fapt in timpul execuiei daca mutex-ul este blocat la intrare i daca a fost blocat de acelai fir care apeleaza acum pthread_mutex_unlock(). In cazul in care aceste condiii nu sunt indeplinite, se returneaza un cod de eroare, iar mutex-ul ramane neschimbat. Mutex-urile ,,fast" nu efectueaza astfel de verificari, permiand astfel ca un mutex blocat sa fie deblocat de catre un alt fir de execuie decat proprietarul sau. Acesta este un comportament neportabil i nu trebuie sa se bazeze pe el. pthread_mutex_destroy() distruge un obiect mutex, eliberand resursele pe care le-ar putea deine. Mutex-ul trebuie sa fie deblocat la intrare. In implementarea LinuxThreads, nicio resursa nu este asociata cu obiectele mutex, astfel incat pthread_mutex_destroy() nu face de fapt nimic, cu excepia verificarii faptului ca mutex-ul este deblocat. ANULARE Niciuna dintre funciile mutex nu este un punct de anulare, nici macar pthread_mutex_lock(), in ciuda faptului ca poate suspenda un fir de execuie pentru durate arbitrare. In acest fel, starea mutex-urilor la punctele de anulare este previzibila, permiand operatorilor de anulare sa deblocheze exact acele mutex-uri care trebuie deblocate inainte ca firul sa se opreasca din execuie. In consecina, firele care utilizeaza anularea amanata nu ar trebui sa deina niciodata un mutex pentru perioade lungi de timp. SIGURANA SEMNALELOR ASINCRONE Funciile mutex nu sunt sigure pentru semnalul asincron. Acest lucru inseamna ca nu trebuie apelate de la un gestionar de semnal. In special, apelarea funciilor pthread_mutex_lock() sau pthread_mutex_unlock() de la un gestionar de semnal poate bloca firul apelant. VALOAREA RETURNATA pthread_mutex_init() returneaza intotdeauna 0. Celelalte funcii mutex returneaza 0 in caz de succes i un cod de eroare diferit de zero in caz de eroare. ERORI-IEIRE Funcia pthread_mutex_lock() returneaza urmatorul cod de eroare in caz de eroare: EINVAL Mutex-ul nu a fost iniializat corespunzator. EDEADLK Mutex-ul este deja blocat de firul apelant (numai mutex-urile ,,error checking"). Funcia pthread_mutex_trylock() returneaza urmatoarele coduri de eroare in caz de eroare: EBUSY Mutex-ul nu a putut fi achiziionat deoarece era blocat in prezent. EINVAL Mutex-ul nu a fost iniializat corespunzator. Funcia pthread_mutex_unlock() returneaza urmatorul cod de eroare in caz de eroare: EINVAL Mutex-ul nu a fost iniializat corespunzator. EPERM Firul apelant nu deine mutex-ul (numai mutex-urile ,,error checking"). Funcia pthread_mutex_destroy() returneaza urmatorul cod de eroare in caz de eroare: EBUSY Mutex-ul este blocat in prezent. CONSULTAI I pthread_mutexattr_init(3), pthread_mutexattr_setkind_np(3), pthread_cancel(3). EXEMPLU O variabila globala partajata x poate fi protejata de un mutex dupa cum urmeaza: int x; pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; Toate accesarile i modificarile la x trebuie sa fie intre paranteze prin apeluri la pthread_mutex_lock() i pthread_mutex_unlock() dupa cum urmeaza: pthread_mutex_lock(&mut); /* opereaza pe x */ pthread_mutex_unlock(&mut); TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.18 17 mai 2025 pthread_mutex_init(3)