pthread_mutex_lock, pthread_mutex_trylock ou pthread_mutex_unlock Sous-routine

Objectif

Verrouille et déverrouille un mutex.

Bibliothèque

Bibliothèque d'unités d'exécution (libpthreads.a)

Syntaxe

#include <pthread.h>
int pthread_mutex_lock ( mutex)
pthread_mutex_t *mutex;
int pthread_mutex_trylock ( mutex)
pthread_mutex_t *mutex;
int pthread_mutex_unlock ( mutex)
pthread_mutex_t *mutex;

Descriptif

L'objet mutex référencé par le paramètre mutex est verrouillé en appelant pthread_mutex_lock. Si le processus mutex est déjà verrouillé, l'unité d'exécution appelante se bloque jusqu'à ce que le processus mutex soit disponible. Cette opération est renvoyée avec l'objet mutex référencé par le paramètre mutex à l'état verrouillé avec l'unité d'exécution appelante comme propriétaire.

Si le type de mutex est PTHREAD_MUTEX_NORMAL, la détection d'interblocage n'est pas fournie. La tentative de reverrouillage du processus mutex provoque un interblocage. Si une unité d'exécution tente de déverrouiller un mutex qu'elle n'a pas verrouillé ou un mutex qui est déverrouillé, un comportement non défini se produit.

Si le type de mutex est PTHREAD_MUTEX_ERRORCHECK, une vérification des erreurs est fournie. Si une unité d'exécution tente de reverrouiller un mutex qu'elle a déjà verrouillé, une erreur est renvoyée. Si une unité d'exécution tente de déverrouiller un mutex qu'elle n'a pas verrouillé ou un mutex qui est déverrouillé, une erreur est renvoyée.

Si le type de mutex est PTHREAD_MUTEX_RECURSIVE, le mutex conserve le concept d'un nombre de verrous. Lorsqu'une unité d'exécution acquiert un mutex pour la première fois, le nombre de verrous est défini sur un. Chaque fois que l'unité d'exécution reverrouille ce mutex, le nombre de verrous est incrémenté de un. Chaque fois que l'unité d'exécution déverrouille le mutex, le nombre de verrous est décrémenté d'un. Lorsque le nombre de verrous atteint zéro, le processus mutex devient disponible pour d'autres unités d'exécution à acquérir. Si une unité d'exécution tente de déverrouiller un mutex qu'elle n'a pas verrouillé ou un mutex qui est déverrouillé, une erreur est renvoyée.

Si le type de mutex est PTHREAD_MUTEX_DEFAULT, la tentative de verrouillage récursif du mutex entraîne un comportement non défini. La tentative de déverrouillage de l'exclusion mutuelle si elle n'a pas été verrouillée par l'unité d'exécution appelante entraîne un comportement non défini. La tentative de déverrouillage du processus mutex s'il n'est pas verrouillé entraîne un comportement non défini.

Si le mutex est un mutex robuste et si l'unité d'exécution qui possède le mutex robuste se termine en maintenant le verrou du mutex, un appel à la sous-routine pthread_mutex_lock renvoie le code d'erreur EOWNERDEAD . Dans ce cas, le mutex robuste est verrouillé par le fil et l'état protégé du mutex robuste est marqué comme incohérent. Un appel à la sous-routine pthread_mutex_consistent peut être utilisé pour marquer l'état protégé du mutex robuste comme cohérent.

Si le mutex est un mutex robuste et si l'état protégé du mutex robuste est incohérent, un appel à la sous-routine pthread_mutex_unlock marque l'état du mutex robuste comme définitivement inutilisable. Dans ce cas, un appel à la sous-routine pthread_mutex_destroy est la seule opération autorisée sur le mutex robuste.

La fonction pthread_mutex_trylock est identique à pthread_mutex_lock , sauf que si l'objet mutex robuste référencé par le paramètre mutex est verrouillé (par n'importe quelle unité d'exécution, y compris l'unité d'exécution en cours), l'appel est immédiatement renvoyé.

La fonction pthread_mutex_unlock libère l'objet mutex référencé par mutex. La manière dont un mutex est libéré dépend de l'attribut de type du mutex. Si des unités d'exécution sont bloquées sur l'objet mutex référencé par le paramètre mutex lorsque pthread_mutex_unlock est appelé, ce qui entraîne la disponibilité du mutex, la règle de planification est utilisée pour déterminer l'unité d'exécution qui acquiert le mutex. (Dans le cas des mutex PTHREAD_MUTEX_RECURSIVE, le mutex devient disponible lorsque le nombre atteint zéro et que l'unité d'exécution appelante n'a plus de verrou sur ce mutex).

Si un signal est délivré à une unité d'exécution en attente d'un mutex, au retour du gestionnaire de signaux, l'unité d'exécution reprend l'attente du mutex comme s'il n'avait pas été interrompu.

Paramètre

Tableau 1. Paramètre
Article Descriptif
exclusion mutuelle Indique le processus mutex à verrouiller.

Valeurs renvoyées

En cas de réussite, les fonctions pthread_mutex_lock et pthread_mutex_unlock renvoient zéro. Sinon, un numéro d'erreur est renvoyé pour indiquer l'erreur.

La fonction pthread_mutex_trylock renvoie zéro si un verrou sur l'objet mutex référencé par le paramètre mutex est acquis. Sinon, un numéro d'erreur est renvoyé pour indiquer l'erreur.

Codes d'erreur

La fonction pthread_mutex_trylock échoue si:

Tableau 2. pthread_mutex_trylock Codes d'erreur
Article Descriptif
EBUSY Il se peut que l'exclusion mutuelle ne soit pas acquise car elle était déjà verrouillée.

Les fonctions pthread_mutex_lock, pthread_mutex_trylock et pthread_mutex_unlock échouent si:

Tableau 3. pthread_mutex_lock, pthread_mutex_trylock Et pthread_mutex_unlock Codes d'erreur
Article Descriptif
EINVAL La valeur spécifiée par le paramètre mutex ne fait pas référence à un objet mutex initialisé.

La fonction pthread_mutex_lock échoue si:

Article Descriptif
EDEADLK L'unité d'exécution en cours possède déjà le mutex et le type de mutex est PTHREAD_MUTEX_ERRORCHECK.

La sous-routine pthread_mutex_unlock() échoue si le code d'erreur suivant est renvoyé:

Tableau 4. pthread_mutex_unlock() Codes d'erreur
Article Descriptif
EPERM Le thread actuel ne possède pas le mutex, et le type du mutex n'est pas PTHREAD_MUTEX_NORMAL ou le mutex est un mutex robuste.
La sous-routine pthread_mutex_lock ou pthread_mutex_trylock échoue si les codes d'erreur suivants sont renvoyés:
Tableau 5. pthread_mutex_lock ou pthread_mutex_trylock Codes d'erreur
Article Descriptif
ENOTREMÉDIABLE L'état protégé du mutex ne peut pas être récupéré.
EOWNERDEAD Le mutex est un mutex robuste, et le processus de l'unité d'exécution qui possède le mutex s'est terminé tout en maintenant le mutex verrouillé.

Ces sous-routines ne renvoient pas de code d'erreur EINTR .