pthread_mutexattr_setrobust(3) Library Functions Manual NUME pthread_mutexattr_getrobust, pthread_mutexattr_setrobust - obine i definete atributul de robustee al unui obiect cu atribute mutex BIBLIOTECA Biblioteca de fire de execuie POSIX (libpthread, -lpthread) SINOPSIS #include int pthread_mutexattr_getrobust(const pthread_mutexattr_t *attr, int *robustness); int pthread_mutexattr_setrobust(pthread_mutexattr_t *attr, int robustness); Cerine pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultai feature_test_macros(7)): pthread_mutexattr_getrobust(), pthread_mutexattr_setrobust(): _POSIX_C_SOURCE >= 200809L DESCRIERE Funcia pthread_mutexattr_getrobust() plaseaza in *robustness valoarea atributului de robustee al obiectului de atribute mutex la care se refera attr. Funcia pthread_mutexattr_setrobust() stabilete valoarea atributului robustee al obiectului atribute mutex la care face referire attr la valoarea specificata in *robustness. Atributul ,,robustness" specifica comportamentul mutex-ului atunci cand firul proprietar moare fara sa deblocheze mutex-ul. Urmatoarele valori sunt valabile pentru robustness: PTHREAD_MUTEX_STALLED Aceasta este valoarea implicita pentru un obiect cu atribute mutex. Daca un mutex este iniializat cu atributul PTHREAD_MUTEX_STALLED i proprietarul sau moare fara sa-l deblocheze, mutex-ul ramane blocat ulterior i orice incercare viitoare de a apela pthread_mutex_lock(3) pe mutex se va bloca pe termen nelimitat. PTHREAD_MUTEX_ROBUST Daca un mutex este iniializat cu atributul PTHREAD_MUTEX_ROBUST i proprietarul sau moare fara a-l debloca, orice incercare viitoare de a apela pthread_mutex_lock(3) pe acest mutex va reui i va returna EOWNERDEAD pentru a indica faptul ca proprietarul iniial nu mai exista i ca mutex-ul este intr-o stare inconsistenta. De obicei, dupa ce EOWNERDEAD este returnat, urmatorul proprietar ar trebui sa apeleze pthread_mutex_consistent(3) pe mutex-ul achiziionat pentru a-l face din nou consistent inainte de a-l utiliza in continuare. Daca urmatorul proprietar deblocheaza mutex-ul folosind pthread_mutex_unlock(3) inainte de a-l face consistent, mutex-ul va fi permanent inutilizabil i orice incercare ulterioara de a-l bloca folosind pthread_mutex_lock(3) va eua cu eroarea ENOTRECOVERABLE. Singura operaie permisa pe un astfel de mutex este pthread_mutex_destroy(3). Daca urmatorul proprietar inceteaza activitatea inainte de a apela pthread_mutex_consistent(3), operaiile ulterioare pthread_mutex_lock(3) asupra acestui mutex vor returna in continuare EOWNERDEAD. Reinei ca argumentul attr din pthread_mutexattr_getrobust() i pthread_mutexattr_setrobust() trebuie sa se refere la un obiect de atribute mutex care a fost iniializat de pthread_mutexattr_init(3), in caz contrar comportamentul este indefinit. VALOAREA RETURNATA In caz de succes, aceste funcii returneaza 0. In caz de eroare, acestea returneaza un numar pozitiv de eroare. In implementarea glibc, pthread_mutexattr_getrobust() returneaza intotdeauna zero. ERORI-IEIRE EINVAL O alta valoare decat PTHREAD_MUTEX_STALLED sau PTHREAD_MUTEX_ROBUST a fost trecuta la pthread_mutexattr_setrobust(). VERSIUNI In implementarea Linux, atunci cand se utilizeaza mutex-uri robuste partajate de proces, un fir in ateptare primete i notificarea EOWNERDEAD daca proprietarul unui mutex robust efectueaza un execve(2) fara a debloca mai intai mutex-ul. POSIX.1 nu specifica acest detaliu, dar acelai comportament apare i in cel puin alte implementari. STANDARDE POSIX.1-2008. ISTORIC glibc 2.12. POSIX.1-2008. Inainte de adaugarea la POSIX a funciilor pthread_mutexattr_getrobust() i pthread_mutexattr_setrobust(), glibc a definit urmatoarele funcii non-standard echivalente daca _GNU_SOURCE era definita: [[depreciat] int pthread_mutexattr_getrobust_np(const pthread_mutexattr_t *attr, int *robustness); [[depreciat] int pthread_mutexattr_setrobust_np(const pthread_mutexattr_t *attr, int robustness); In consecina, au fost definite i constantele PTHREAD_MUTEX_STALLED_NP i PTHREAD_MUTEX_ROBUST_NP. Aceste API-uri specifice GNU, care au aparut pentru prima data in glibc 2.4, sunt in prezent invechite i nu ar trebui utilizate in programe noi; incepand cu glibc 2.34 aceste API-uri sunt marcate ca fiind depreciate. EXEMPLE Programul de mai jos demonstreaza utilizarea atributului ,,robustness" al unui obiect cu atribute mutex. In acest program, un fir care deine mutex-ul moare prematur fara sa deblocheze mutex-ul. Firul principal dobandete ulterior mutex-ul cu succes i primete eroarea EOWNERDEAD, dupa care face mutex-ul consistent. Urmatoarea sesiune shell arata ce vedem la rularea acestui program: $ ./a.out [proprietarul original ] Amplasarea blocarii... [proprietarul original] Blocat. Acum ies fara sa deblochez. [main] Se incearca blocarea mutex-ului robust. [main] pthread_mutex_lock() a returnat EOWNERDEAD [main] Acum se face mutex-ul consistent [main] Mutex-ul este acum consistent; se deblocheaza Sursa programului #include #include #include #include #include #define handle_error_en(en, msg) \ do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0) static pthread_mutex_t mtx; static void * original_owner_thread(void *ptr) { printf("[proprietarul original ] Amplasarea blocarii...\n"); pthread_mutex_lock(&mtx); printf("[proprietarul original] Blocat. Acum ies fara sa deblochez.\n"); pthread_exit(NULL); } int main(void) { pthread_t thr; pthread_mutexattr_t attr; int s; pthread_mutexattr_init(&attr); pthread_mutexattr_setrobust(&attr, PTHREAD_MUTEX_ROBUST); pthread_mutex_init(&mtx, &attr); pthread_create(&thr, NULL, original_owner_thread, NULL); sleep(2); /* ,,original_owner_thread" ar trebui sa fi ieit pana acum. */ printf("[main] Se incearca blocarea mutex-ului robust.\n"); s = pthread_mutex_lock(&mtx); if (s == EOWNERDEAD) { printf("[main] pthread_mutex_lock() a returnat EOWNERDEAD\n"); printf("[main] Acum se face mutex-ul consistent\n"); s = pthread_mutex_consistent(&mtx); if (s != 0) handle_error_en(s, "pthread_mutex_consistent"); printf("[main] Mutex-ul este acum consistent; se deblocheaza\n"); s = pthread_mutex_unlock(&mtx); if (s != 0) handle_error_en(s, "pthread_mutex_unlock"); exit(EXIT_SUCCESS); } else if (s == 0) { printf("[main] pthread_mutex_lock() a reuit in mod neateptat\n"); exit(EXIT_FAILURE); } else { printf("[main] pthread_mutex_lock() a euat in mod neateptat[main]\n"); handle_error_en(s, "pthread_mutex_lock"); } } CONSULTAI I get_robust_list(2), set_robust_list(2), pthread_mutex_consistent(3), pthread_mutex_init(3), pthread_mutex_lock(3), pthreads(7) 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.12 23 iulie 2024 pthread_mutexattr_setrobust(3)