.\" -*- coding: UTF-8 -*- .\" Copyright (c) 2017, Yubin Ruan .\" and Copyright (c) 2017, Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH pthread_mutexattr_setrobust 3 "31 октября 2023 г." "Linux man\-pages 6.06" .SH ИМЯ pthread_mutexattr_getrobust, pthread_mutexattr_setrobust \- возвращает и изменяет атрибут устойчивости в объекте мьютексных атрибутов .SH LIBRARY POSIX threads library (\fIlibpthread\fP, \fI\-lpthread\fP) .SH СИНТАКСИС .nf \fB#include \fP .P \fBint pthread_mutexattr_getrobust(const pthread_mutexattr_t *\fP\fIattr\fP\fB,\fP \fB int *\fP\fIrobustness\fP\fB);\fP \fBint pthread_mutexattr_setrobust(pthread_mutexattr_t *\fP\fIattr\fP\fB,\fP \fB int \fP\fIrobustness\fP\fB);\fP .fi .P .RS -4 Требования макроса тестирования свойств для glibc (см. \fBfeature_test_macros\fP(7)): .RE .P \fBpthread_mutexattr_getrobust\fP(), \fBpthread_mutexattr_setrobust\fP(): .nf .\" FIXME . .\" But see https://sourceware.org/bugzilla/show_bug.cgi?id=22125 _POSIX_C_SOURCE >= 200809L .fi .SH ОПИСАНИЕ Функция \fBpthread_mutexattr_getrobust\fP() помещает значение атрибута устойчивости (robustness) из объекта мьютексных атрибутов, на который указывает \fIattr\fP, в \fI*robustness\fP. Функция \fBpthread_mutexattr_setrobust\fP() изменяет значение атрибута устойчивости в объекте мьютексных атрибутов, на который указывает \fIattr\fP, на значение, заданное в \fI*robustness\fP. .P Атрибут устойчивости определяет поведение мьютекса после того как владеющая нить завершает работу, но не разблокировала мьютекс. Для \fIrobustness\fP возможны следующие значения: .TP \fBPTHREAD_MUTEX_STALLED\fP Значение по умолчанию для объекта мьютексных атрибутов. Если мьютекс инициализирован с атрибутом \fBPTHREAD_MUTEX_STALLED\fP и его владелец завершает работу без его разблокировки, то после этого мьютекс остаётся заблокированным и все последующие попытки вызова \fBpthread_mutex_lock\fP(3) для этого мьютекса будут заблокированы навсегда. .TP \fBPTHREAD_MUTEX_ROBUST\fP Если мьютекса инициализирован с атрибутом \fBPTHREAD_MUTEX_ROBUST\fP и и его владелец завершает работу без его разблокировки,то все последующие попытки вызова \fBpthread_mutex_lock\fP(3) для этого мьютекса будут успешно выполнены возвращается \fBEOWNERDEAD\fP, чтобы показать, что первоначальный владелец не существует и мьютекс находится в неопределенном состоянии. Обычно, после возврата \fBEOWNERDEAD\fP перед началом использования следующий владелец должен вызвать \fBpthread_mutex_consistent\fP(3) над полученным мьютексом, чтобы снова сделать его согласованным. .IP Если следующий владелец разблокирует мьютекс с помощью \fBpthread_mutex_unlock\fP(3) до того, как сделать его согласованным, мьютекс станет необратимо неработоспособен и последующие попытки заблокировать его с помощью \fBpthread_mutex_lock\fP(3) будут завершаться ошибкой \fBENOTRECOVERABLE\fP. Для такого мьютекса доступна только одна операция — \fBpthread_mutex_destroy\fP(3). .IP Если следующий владелец завершит работу до вызова \fBpthread_mutex_consistent\fP(3), то последующие операций \fBpthread_mutex_lock\fP(3) с этим мьютексом будут по прежнему возвращать \fBEOWNERDEAD\fP. .P Заметим, что аргумент \fIattr\fP у \fBpthread_mutexattr_getrobust\fP() и \fBpthread_mutexattr_setrobust\fP() должен указывать на объект мьютексных атрибутов, который был инициализирован \fBpthread_mutexattr_init\fP(3), в противном случае поведение не определено. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении эти функции возвращают 0. При ошибке возвращается положительный номер ошибки. .P В реализации glibc функция \fBpthread_mutexattr_getrobust\fP() всегда возвращает ноль. .SH ОШИБКИ .TP \fBEINVAL\fP Помимо \fBPTHREAD_MUTEX_STALLED\fP или \fBPTHREAD_MUTEX_ROBUST\fP в \fBpthread_mutexattr_setrobust\fP() передано что\-то ещё. .SH ВЕРСИИ .\" E.g., Solaris, according to its manual page В реализации Linux при использовании общих для процессов устойчивых мьютексов ожидающая нить также получает уведомление \fBEOWNERDEAD\fP, если владелец устойчивого мьютекса выполняет \fBexecve\fP(2) без предварительной разблокировки мьютекса. В POSIX.1 не указана данная подробность, но такое же поведение также встречается и в нескольких других реализациях. .SH СТАНДАРТЫ POSIX.1\-2008. .SH ИСТОРИЯ glibc 2.12. POSIX.1\-2008. .P До появления \fBpthread_mutexattr_getrobust\fP() и \fBpthread_mutexattr_setrobust\fP() в POSIX, в glibc определись следующие эквиваленты нестандартных функций, если определён \fB_GNU_SOURCE\fP: .P .nf \fB[[deprecated]]\fP \fBint pthread_mutexattr_getrobust_np(const pthread_mutexattr_t *\fP\fIattr\fP\fB,\fP \fB int *\fP\fIrobustness\fP\fB);\fP \fB[[deprecated]]\fP \fBint pthread_mutexattr_setrobust_np(const pthread_mutexattr_t *\fP\fIattr\fP\fB,\fP \fB int \fP\fIrobustness\fP\fB);\fP .fi .P Соответственно, также определены константы \fBPTHREAD_MUTEX_STALLED_NP\fP и \fBPTHREAD_MUTEX_ROBUST_NP\fP. .P 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. .SH ПРИМЕРЫ В программе, представленной далее, показывается использование атрибута устойчивости в объекте мьютексных атрибутов. В этой программе нить, удерживающая мьютекс, завершает работу без разблокировки мьютекса. После этого главная нить захватывает мьютекс и получает ошибку \fBEOWNERDEAD\fP, после чего делает мьютекс согласованным. .P Пример сеанса работы с программой: .P .in +4n .EX $ \fB./a.out\fP [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 .EE .in .SS "Исходный код программы" .\" SRC BEGIN (pthread_mutexattr_setrobust.c) .EX #include #include #include #include #include \& #define handle_error_en(en, msg) \e 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...\en"); pthread_mutex_lock(&mtx); printf("[original owner] Locked. Now exiting without unlocking.\en"); 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.\en"); s = pthread_mutex_lock(&mtx); if (s == EOWNERDEAD) { printf("[main] pthread_mutex_lock() returned EOWNERDEAD\en"); printf("[main] Now make the mutex consistent\en"); s = pthread_mutex_consistent(&mtx); if (s != 0) handle_error_en(s, "pthread_mutex_consistent"); printf("[main] Mutex is now consistent; unlocking\en"); 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\en"); exit(EXIT_FAILURE); } else { printf("[main] pthread_mutex_lock() unexpectedly failed\en"); handle_error_en(s, "pthread_mutex_lock"); } } .EE .\" SRC END .SH "СМ. ТАКЖЕ" .ad l .nh \fBget_robust_list\fP(2), \fBset_robust_list\fP(2), \fBpthread_mutex_consistent\fP(3), \fBpthread_mutex_init\fP(3), \fBpthread_mutex_lock\fP(3), \fBpthreads\fP(7) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Alexey, Azamat Hackimov , kogamatranslator49 , Kogan, Max Is , Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .