Man page - pthread_mutexattr_getrobust(3)

Packages contains this manual

Available languages:

en fr ru ro

Manual

pthread_mutexattr_setrobust

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
VERSIONS
STANDARDS
HISTORIQUE
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION

NOM

pthread_mutexattr_getrobust, pthread_mutexattr_setrobust — DĂ©finir ou obtenir l’attribut de robustesse d’un objet d’attributs de mutex

BIBLIOTHÈQUE

BibliothĂšque de threads POSIX ( libpthread , -lpthread )

SYNOPSIS

#include <pthread.h>

int pthread_mutexattr_getrobust(const pthread_mutexattr_t * attr ,
int *
robustesse );
int pthread_mutexattr_setrobust(pthread_mutexattr_t *
attr ,
int
robustesse );

Exigences de macros de test de fonctionnalités pour la glibc (consulter feature_test_macros (7)) :

pthread_mutexattr_getrobust (), pthread_mutexattr_setrobust () :
_POSIX_C_SOURCE >= 200809L

DESCRIPTION

La fonction pthread_mutexattr_getrobust () place la valeur de l’attribut de robustesse de l’objet d’attributs de mutex auquel attr fait rĂ©fĂ©rence dans *robustesse . La fonction pthread_mutexattr_setrobust () dĂ©finit Ă  la valeur spĂ©cifiĂ©e dans *robustesse la valeur de l’attribut de robustesse de l’objet d’attributs de mutex auquel attr fait rĂ©fĂ©rence.

L’attribut de robustesse dĂ©finit le comportement du mutex quand le thread propriĂ©taire finit sans dĂ©verrouiller le mutex. Les valeurs suivantes sont permises pour robustesse :
PTHREAD_MUTEX_STALLED

C’est la valeur par dĂ©faut pour un objet d’attributs de mutex. Si un mutex est initialisĂ© avec l’attribut PTHREAD_MUTEX_STALLED et si son propriĂ©taire finit sans le dĂ©verrouiller, le mutex demeure verrouillĂ© ensuite et toute tentative ultĂ©rieure pour appeler pthread_mutex_lock (3) sur le mutex bloquera indĂ©finiment.

PTHREAD_MUTEX_ROBUST

Si un mutex est initialisĂ© avec l’attribut PTHREAD_MUTEX_ROBUST et si son propriĂ©taire finit sans le dĂ©verrouiller, toute tentative ultĂ©rieure pour appeler pthread_mutex_lock (3) sur ce mutex rĂ©ussira et renverra EOWNERDEAD pour indiquer que le propriĂ©taire d’origine n’existe plus et que le mutex est dans un Ă©tat incohĂ©rent. Habituellement, aprĂšs l’envoi de EOWNERDEAD , le propriĂ©taire suivant devrait appeler pthread_mutex_consistent (3) sur le mutex acquis pour le rendre Ă  nouveau cohĂ©rent avant de l’utiliser plus avant.

Si le propriĂ©taire suivant dĂ©verrouille le mutex avec pthread_mutex_unlock (3) avant de le rendre cohĂ©rent, le mutex demeurera inutilisable de façon permanente et toute tentative ultĂ©rieure pour le verrouiller avec pthread_mutex_lock (3) Ă©chouera avec l’erreur ENOTRECOVERABLE . pthread_mutex_destroy (3) est la seule opĂ©ration permise sur un mutex dans cet Ă©tat.

Si le propriĂ©taire suivant termine avant d’appeler pthread_mutex_consistent (3), les opĂ©rations pthread_mutex_lock (3) ultĂ©rieures sur ce mutex renverront encore EOWNERDEAD .

Veuillez noter que l’argument attr de pthread_mutexattr_getrobust () et de pthread_mutexattr_setrobust () doit faire rĂ©fĂ©rence Ă  l’objet d’attributs de mutex initialisĂ© par pthread_mutexattr_init (3), autrement le comportement est indĂ©fini.

VALEUR RENVOYÉE

En cas de rĂ©ussite, ces fonctions renvoient 0 ; en cas d’erreur, elles renvoient un code d’erreur positif.

Dans l’implĂ©mentation de la glibc, pthread_mutexattr_getrobust () renvoie toujours zĂ©ro.

ERREURS

EINVAL

Une valeur autre que PTHREAD_MUTEX_STALLED ou PTHREAD_MUTEX_ROBUST a été passée à pthread_mutexattr_setrobust ().

VERSIONS

Dans l’implĂ©mentation de Linux, lors de l’utilisation de mutex Ă  processus partagĂ© robustes, un thread en attente reçoit Ă©galement la notification EOWNERDEAD si le propriĂ©taire d’un mutex robuste rĂ©alise une commande execve (2) sans avoir prĂ©alablement dĂ©verrouillĂ© le mutex. POSIX.1 ne spĂ©cifie pas ce dĂ©tail, mais le mĂȘme comportement se produit aussi dans au moins quelques autres implĂ©mentations.

STANDARDS

POSIX.1-2008.

HISTORIQUE

glibc 2.12. POSIX.1-2008.

Avant l’ajout Ă  POSIX de pthread_mutexattr_getrobust () et pthread_mutexattr_setrobust (), la glibc dĂ©finissait les fonctions non standard Ă©quivalentes suivantes si _GNU_SOURCE Ă©tait dĂ©fini :

[[obsolĂšte]]
int pthread_mutexattr_getrobust_np(const pthread_mutexattr_t *
attr ,
int *
robustesse );
[[obsolĂšte]]
int pthread_mutexattr_setrobust_np(const pthread_mutexattr_t *
attr ,
int
robustesse );

De la mĂȘme façon, les constantes PTHREAD_MUTEX_STALLED_NP et PTHREAD_MUTEX_ROBUST_NP Ă©taient Ă©galement dĂ©finies.

Ces API propres Ă  GNU, apparues dans la glibc 2.4, sont Ă  prĂ©sent obsolĂštes et ne devraient pas ĂȘtre utilisĂ©es dans de nouveaux programmes. Depuis la glibc 2.34, ces API sont marquĂ©es comme obsolĂštes.

EXEMPLES

Le programme ci-dessous montre l’utilisation de l’attribut de robustesse d’un objet d’attributs de mutex. Dans ce programme, un thread possĂ©dant le mutex s’interrompt prĂ©maturĂ©ment sans dĂ©verrouiller le mutex. Le thread principal acquiert ensuite le mutex avec succĂšs et reçoit l’erreur EOWNERDEAD aprĂšs quoi il rend le mutex cohĂ©rent.

La session d’interprĂ©teur de commande suivante montre l’exĂ©cution de ce programme :

$ ./a.out
[original owner] Mise en place du verrou...
[original owner] Verrouillé. Sortie sans déverrouillage.
[main] Tentative de verrouillage du mutex robuste.
[main] pthread_mutex_lock() renvoie EOWNERDEAD
[main] Maintenant rendre le mutex cohérent
[main] Le mutex est maintenant cohérent ; déverrouillage

Source du programme

#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#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");
}
}

VOIR AUSSI

get_robust_list (2), set_robust_list (2), pthread_mutex_consistent (3), pthread_mutex_init (3), pthread_mutex_lock (3), pthreads (7)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Frédéric Hantrais <fhantrais@gmail.com> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .