Quel est l ' "attribut" d'un mutex pthread?
La fonction pthread_mutex_init vous permet d'indiquer un pointeur vers un attribut. Mais je dois encore trouver une bonne explication de ce que sont les attributs de pthread. J'ai toujours fourni la valeur NULL. Est-il l'utilisation de cet argument?
La documentation, pour ceux d'entre vous qui l'oublier:
PTHREAD_MUTEX_INIT (3) BSD Library Manuel Des Fonctions
PTHREAD_MUTEX_INIT (3)NOM de pthread_mutex_init -- créer un mutex
SYNOPSIS
#include <pthread.h> int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
DESCRIPTION La fonction pthread_mutex_init() crée un nouveau mutex, avec des attributs défini avec attr. Si attr est nul, les attributs par défaut sont utilisés.
4 réponses
le meilleur endroit pour trouver cette information est les pages des normes POSIX.
NULL
l'attribut mutex vous donne un attribut par défaut défini par l'implémentation. Si vous voulez savoir ce que vous pouvez faire avec des attributs, consultez le suivant la référence et suivre le pthread_mutexattr_*
liens SEE ALSO
section. Habituellement, la valeur par défaut est un ensemble raisonnable d'attributs, mais il peut varier entre les plates-formes, donc je préfère explicitement créer des Mutex avec des attributs connus (mieux pour la portabilité).
Ceci est pour la septième édition de la norme, 1003.1-2008. Le point de départ pour cela est ici. En cliquant sur Headers
en bas à gauche vous permettra de naviguer à des fonctionnalités spécifiques (y compris pthreads.h
).
Les attributs permettent de définir ou obtenir:
- tapez (blocage, blocage de détection, récursive, etc).
- robustesse (qu'arrive-t-il lorsque vous acquérir un mutex et le propriétaire d'origine est mort, tout en possédant).
- attribut de processus partagé (pour partager un mutex au-delà des limites du processus).
- protocole (comment un fil se comporte en termes de priorité lorsqu'un thread de priorité supérieure veut le mutex).
- plafond de priorité (la priorité à laquelle s'effectuera la section critique, une façon d'empêcher la priorité inversion.)
Et, pour être complet, il y a le init et de détruire les appels ainsi, pas directement lié à un attribut spécifique mais utilisé pour les créer.
Tous les mutex les attributs sont définis dans un mutex attribut de l'objet par une fonction de la forme:
int pthread_mutexattr_setname(pthread_attr_t *attr, Type t);
Tous les attributs de mutex sont récupérées à partir d'un mutex attribut de l'objet par une fonction de la forme:
int pthread_mutexattr_getname(const pthread_attr_t *attr, Type *t);
où nom et Type sont définis comme dans le tableau ci-dessous:
Type and Name Description and Value(s)
int protocol Define the scheduling classes for mutex locks
PTHREAD_PRIO_NONE,PTHREAD_PRIO_PROTECT,
PTHREAD_PRIO_INHERIT
int pshared Defines whether a mutex is shared with other processes.
PTHREAD_PROCESS_SHARED, PTHREAD_PROCESS_PRIVATE
int prioceiling Used for mutex attribute priority ceiling values.
See POSIX.1 section 13
int type Application defined mutex locking
PTHREAD_MUTEX_NORMAL,PTHREAD_MUTEX_RECURSIVE,
PTHREAD_MUTEX_ERRORCHECK,PTHREAD_MUTEX_DEFAULT
si vous faites défiler vers le bas la liste des fonctions pour <pthread.h>
, vous trouverez un tas de pthread_mutexattr_...
fonctions, y compris un init
, destroy
et des fonctions pour définir divers attributs d'un mutex. Lorsque vous transmettez NULL
, le mutex est créé par défaut pour tous ces attributs, mais si vous avez besoin de modifier des attributs spécifiques, vous pouvez construire un pthread_mutexattr_t
structurez et passez-le.
appliquer NULL à cet argument implique d'utiliser l'argument par défaut. Donc, pour certaines raisons, vous pourriez vouloir modifier ces paramètres par défaut (en utilisant pthread_mutexattr_init).
la documentation explique tout ce dont vous avez besoin sur ces paramètres mutex.