Sous-routine pthread_mutex_timedlock
Objectif
Verrouille un mutex (ADVANCED REALTIME).
Syntaxe
#include <pthread.h>
#include <time.h>
int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex,
const struct timespec *restrict abs_timeout);
Descriptif
La fonction pthread_mutex_timedlock () verrouille l'objet mutex référencé par mutex. Si le mutex est déjà verrouillé, l'unité d'exécution appelante se bloque jusqu'à ce que le mutex soit disponible, comme dans la fonction pthread_mutex_lock () . Si le processus mutex ne peut pas être verrouillé sans attendre qu'une autre unité d'exécution déverrouille le processus mutex, cette attente se termine lorsque le délai d'attente spécifié expire.
Le délai d'attente expire lorsque le temps absolu spécifié par abs_timeout est écoulé-mesuré par l'horloge sur laquelle sont basés les délais d'attente (c'est-à-dire lorsque la valeur de cette horloge est égale ou supérieure à abs_timeout)-ou lorsque le temps absolu spécifié par abs_timeout a déjà été passé au moment de l'appel.
Si l'option Timers est prise en charge, le délai d'attente est basé sur l'horloge CLOCK_REALTIME ; si l'option Timers n'est pas prise en charge, le délai d'attente est basé sur l'horloge système renvoyée par la fonction time () .
La résolution du délai d'attente correspond à la résolution de l'horloge sur laquelle elle est basée. Le type de données timespec est défini dans l'en-tête <time.h> .
La fonction n'échoue jamais avec un délai d'attente si le processus mutex peut être verrouillé immédiatement. La validité du paramètre abs_timeout n'a pas besoin d'être vérifiée si le mutex peut être verrouillé immédiatement.
En conséquence des règles d'héritage de priorité (pour les mutex initialisés avec le protocole PRIO_INHERIT), si une attente de mutex temporisée est arrêtée en raison de l'expiration de son délai d'attente, la priorité du propriétaire du mutex s'ajuste selon les besoins pour refléter le fait que cette unité d'exécution n'est plus parmi les unités d'exécution en attente du mutex.
Si le mutex est un mutex robuste et si l'unité d'exécution propriétaire du mutex robuste se termine en maintenant le verrou de mutex, un appel à la sous-routine pthread_mutex_timedlock 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 protégé 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.
Utilisation des Applications
La fonction pthread_mutex_timedlock () fait partie des options Threads et Timeouts et n'a pas besoin d'être fournie sur toutes les implémentations.
Valeurs renvoyées
Si l'opération aboutit, la sous-routine pthread_mutex_timedlock renvoie 0 ; sinon, un numéro d'erreur est renvoyé pour indiquer l'erreur.
Codes d'erreur
La sous-routine pthread_mutex_timedlock peut échouer en raison de l'une des erreurs suivantes:
| Article | Descriptif |
|---|---|
| EDEADLK | L'unité d'exécution en cours possède déjà le processus mutex. |
| EINVAL | Le mutex a été créé avec l'attribut de protocole ayant la valeur PTHREAD_PRIO_PROTECT, et la priorité de l'unité d'exécution appelante est supérieure au plafond de priorité en cours du mutex. |
| EINVAL | Le processus ou l'unité d'exécution aurait été bloqué et le paramètre abs_timeout a spécifié une valeur de zone de nanosecondes inférieure à 0 ou supérieure ou égale à 1000 millions. |
| EINVAL | abs_timeout est un pointeur NULL. |
| EINVAL | La valeur spécifiée par mutex ne fait pas référence à un objet mutex initialisé. |
| ETIMEDOUT | Le processus mutex n'a pas pu être verrouillé avant l'expiration du délai spécifié. |
| 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é. |
Cette fonction ne renvoie pas le code d'erreur EINTR .