pthread_mutexattr_setrobust(3) Library Functions Manual pthread_mutexattr_getrobust, pthread_mutexattr_setrobust - LIBRARY POSIX threads library (libpthread, -lpthread) #include int pthread_mutexattr_getrobust(const pthread_mutexattr_t *attr, int *robustness); int pthread_mutexattr_setrobust(pthread_mutexattr_t *attr, int robustness); glibc (. feature_test_macros(7)): pthread_mutexattr_getrobust(), pthread_mutexattr_setrobust(): _POSIX_C_SOURCE >= 200809L pthread_mutexattr_getrobust() (robustness) , attr, *robustness. pthread_mutexattr_setrobust() , attr, , *robustness. , . robustness : PTHREAD_MUTEX_STALLED . PTHREAD_MUTEX_STALLED , pthread_mutex_lock(3) . PTHREAD_MUTEX_ROBUST PTHREAD_MUTEX_ROBUST , pthread_mutex_lock(3) EOWNERDEAD, , . , EOWNERDEAD pthread_mutex_consistent(3) , . pthread_mutex_unlock(3) , , pthread_mutex_lock(3) ENOTRECOVERABLE. -- pthread_mutex_destroy(3). pthread_mutex_consistent(3), pthread_mutex_lock(3) EOWNERDEAD. , attr pthread_mutexattr_getrobust() pthread_mutexattr_setrobust() , pthread_mutexattr_init(3), . 0. . glibc pthread_mutexattr_getrobust() . EINVAL PTHREAD_MUTEX_STALLED PTHREAD_MUTEX_ROBUST pthread_mutexattr_setrobust() - . Linux EOWNERDEAD, execve(2) . POSIX.1 , . POSIX.1-2008. glibc 2.12. POSIX.1-2008. pthread_mutexattr_getrobust() pthread_mutexattr_setrobust() POSIX, glibc , _GNU_SOURCE: [[deprecated]] int pthread_mutexattr_getrobust_np(const pthread_mutexattr_t *attr, int *robustness); [[deprecated]] int pthread_mutexattr_setrobust_np(const pthread_mutexattr_t *attr, int robustness); , PTHREAD_MUTEX_STALLED_NP PTHREAD_MUTEX_ROBUST_NP. These GNU-specific APIs, which first appeared in glibc 2.4, are nowadays obsolete and should not be used in new programs; since glibc 2.34 these APIs are marked as deprecated. , , . , , . EOWNERDEAD, . : $ ./a.out [original owner] Setting lock... [original owner] Locked. Now exiting without unlocking. [main] Attempting to lock the robust mutex. [main] pthread_mutex_lock() returned EOWNERDEAD [main] Now make the mutex consistent [main] Mutex is now consistent; unlocking #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("[original owner] Setting lock...\n"); pthread_mutex_lock(&mtx); printf("[original owner] Locked. Now exiting without unlocking.\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" should have exited by now. */ printf("[main] Attempting to lock the robust mutex.\n"); s = pthread_mutex_lock(&mtx); if (s == EOWNERDEAD) { printf("[main] pthread_mutex_lock() returned EOWNERDEAD\n"); printf("[main] Now make the mutex consistent\n"); s = pthread_mutex_consistent(&mtx); if (s != 0) handle_error_en(s, "pthread_mutex_consistent"); printf("[main] Mutex is now consistent; unlocking\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() unexpectedly succeeded\n"); exit(EXIT_FAILURE); } else { printf("[main] pthread_mutex_lock() unexpectedly failed\n"); handle_error_en(s, "pthread_mutex_lock"); } } . get_robust_list(2), set_robust_list(2), pthread_mutex_consistent(3), pthread_mutex_init(3), pthread_mutex_lock(3), pthreads(7) Alexey, Azamat Hackimov , kogamatranslator49 , Kogan, Max Is , Yuri Kozlov ; GNU 3 , . . , , . Linux man-pages 6.06 31 2023 . pthread_mutexattr_setrobust(3)