pthread_mutexattr_getprotocol ou pthread_mutexattr_setprotocol Sous-routine

Objectif

Extrait et définit l'attribut de protocole de l'objet d'attributs de processus mutex.

Syntaxe

#include <pthread.h>

int pthread_mutexattr_getprotocol(const pthread_mutexattr_t *
       restrict attr, int *restrict protocol);
int pthread_mutexattr_setprotocol(pthread_mutexattr_t *attr,
       int protocol); 

Descriptif

La sous-routine pthread_mutexattr_getprotocol et la sous-routine pthread_mutexattr_setprotocol obtiennent et définissent le paramètre protocol d'un objet d'attributs mutex désigné par le paramètre attr , qui a été précédemment créé par la sous-routine pthread_mutexattr_init .

L'attribut protocol définit le protocole à suivre lors de l'utilisation de mutex. La valeur du paramètre protocol peut être l'une des suivantes, qui sont définies dans le fichier d'en-tête pthread.h :
  • PTHREAD_PRIO_NONE
  • PTHREAD_PRIO_INHERIT
  • PTHREAD_PRIO_PROTECT

Lorsqu'une unité d'exécution possède un mutex avec l'attribut de protocole PTHREAD_PRIO_NONE , sa priorité et sa planification ne sont pas affectées par sa propriété mutex.

Lorsqu'une unité d'exécution bloque des unités d'exécution de priorité plus élevée car elle est propriétaire d'une ou de plusieurs exclusions mutuelles avec l'attribut de protocole PTHREAD_PRIO_INHERIT , elle s'exécute à la priorité la plus élevée ou à la priorité de l'unité d'exécution de priorité la plus élevée en attente de l'une des exclusions mutuelles appartenant à cette unité d'exécution et initialisée avec ce protocole.

Lorsqu'une unité d'exécution possède un ou plusieurs mutex initialisés avec le protocole PTHREAD_PRIO_PROTECT , elle s'exécute au niveau le plus élevé de sa priorité ou au niveau le plus élevé des plafonds de priorité de tous les mutex détenus par cette unité d'exécution et initialisés avec cet attribut, que d'autres unités d'exécution soient bloquées ou non sur l'un de ces mutex. La vérification des privilèges est nécessaire lorsque le plafond de priorité de mutex est plus favorisé que la priorité d'unité d'exécution en cours et que la priorité d'unité d'exécution doit être modifiée. La sous-routine pthread_mutex_lock n'échoue pas en raison de privilèges inappropriés. Le verrouillage aboutit dans ce cas, mais aucun boosting n'est effectué.

Lorsqu'une unité d'exécution détient un mutex qui a été initialisé avec les attributs de protocole PTHREAD_PRIO_INHERIT ou PTHREAD_PRIO_PROTECT , il n'est pas susceptible d'être déplacé à la fin de la file d'attente de planification à sa priorité si sa priorité d'origine est modifiée, par exemple par un appel à la sous-routine sched_setparam . De même, lorsqu'une unité d'exécution déverrouille un mutex qui a été initialisé avec les attributs de protocole PTHREAD_PRIO_INHERIT ou PTHREAD_PRIO_PROTECT , il n'est pas susceptible d'être déplacé à la fin de la file d'attente de planification à sa priorité si sa priorité d'origine est modifiée.

Si une unité d'exécution possède simultanément plusieurs mutex initialisés avec des protocoles différents, elle s'exécute au niveau le plus élevé des priorités qu'elle aurait obtenues par chacun de ces protocoles.

Lorsqu'une unité d'exécution appelle la sous-routine pthread_mutex_lock , le processus mutex a été initialisé avec l'attribut de protocole ayant la valeur PTHREAD_PRIO_INHERIT, lorsque l'unité d'exécution appelante est bloquée car le processus mutex appartient à une autre unité d'exécution, cette unité d'exécution propriétaire hérite du niveau de priorité de l'unité d'exécution appelante tant qu'elle reste propriétaire du processus mutex. L'implémentation met à jour sa priorité d'exécution au maximum de sa priorité affectée et de toutes ses priorités héritées. En outre, si cette unité d'exécution propriétaire est elle-même bloquée sur un autre mutex, le même effet d'héritage de priorité sera propagé à cette autre unité d'exécution propriétaire, de manière récursive.

Valeurs renvoyées

Une fois l'opération terminée, la sous-routine pthread_mutexattr_getprotocol et la sous-routine pthread_mutexattr_setprotocol renvoient zéro ; sinon, un numéro d'erreur est renvoyé pour indiquer l'erreur.

Codes d'erreur

La sous-routine pthread_mutexattr_setprotocol échoue si:
Article Descriptif
ENOTSUP La valeur spécifiée par le paramètre protocol n'est pas prise en charge.
La sous-routine pthread_mutexattr_getprotocol et la sous-routine pthread_mutexattr_setprotocol peuvent échouer si:
Article Descriptif
EINVAL La valeur spécifiée par le paramètre attr ou le paramètre protocol n'est pas valide.
ENOSYS Cette fonction n'est pas prise en charge (brouillon 7).
ENOTSUP Cette fonction n'est pas prise en charge avec checkpoint/restart.
EPERM L'appelant n'a pas le privilège d'effectuer l'opération dans un environnement strictement conforme aux normes dans lequel la variable d'environnement XPG_SUS_ENV=ON.