2010-11-23 42 views
23

La fonction pthread_mutex_init vous permet de spécifier un pointeur sur un attribut. Mais je n'ai pas encore trouvé une bonne explication de ce que sont les attributs de pthread. J'ai toujours juste fourni NULL. Y a-t-il une utilité à cet argument?quel est "l'attribut" d'un mutex pthread?

La documentation, pour ceux d'entre vous qui l'oublier:

pthread_mutex_init (3) Bibliothèque BSD Fonctions Manuel
pthread_mutex_init (3)

NOM 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 les attributs spécifiés avec attr. Si attr est NULL, les attributs par défaut sont utilisés.

Répondre

33

Le meilleur endroit pour trouver cette information est à partir des pages de normes POSIX.

Un attribut mutex NULL vous donne un attribut par défaut défini par l'implémentation. Si vous voulez savoir ce que vous pouvez faire avec les attributs, consultez le following reference et suivez les liens pthread_mutexattr_* dans la section SEE ALSO. Habituellement, la valeur par défaut est un ensemble d'attributs judicieux, mais elle peut varier d'une plate-forme à une autre, donc je préfère créer explicitement des mutex avec des attributs connus (mieux pour la portabilité).

Ceci est pour le numéro 7 de la norme, 1003.1-2008. Le point de départ est here. En cliquant sur Headers en bas à gauche, vous pourrez accéder aux fonctionnalités spécifiques (y compris pthreads.h).

Les attributs permettent de définir ou obtenir:

  • la type (interblocage, impasse-détection, récursif, etc.).
  • le robustness (que se passe-t-il lorsque vous acquérez un mutex et que le propriétaire d'origine est mort en le possédant).
  • le process-shared attribute (pour partager un mutex à travers les limites du processus).
  • le protocol (comment un thread se comporte en termes de priorité lorsqu'un thread de priorité plus élevée veut le mutex).
  • le priority ceiling (la priorité à laquelle la section critique fonctionnera, un moyen d'empêcher l'inversion de priorité).

Et, pour être complet, il y a aussi le init and destroy calls, qui n'est pas directement lié à un attribut spécifique mais utilisé pour les créer.

1

Si vous faites défiler la liste pour fonction <pthread.h>, vous trouverez un tas de pthread_mutexattr_... fonctions, y compris un init, destroy et fonctions pour définir divers attributs d'un mutex. Lorsque vous transmettez NULL, le mutex est créé avec des valeurs par défaut appropriées pour tous ces attributs, mais si vous devez modifier des attributs spécifiques, vous pouvez construire une structure pthread_mutexattr_t et la transmettre.

4

Tous les attributs de mutex sont définis dans un attribut mutex objet en fonction de la forme:

int pthread_mutexattr_setname(pthread_attr_t *attr, Type t); 

Tous les attributs de mutex sont récupérés à partir d'un objet d'attributs de mutex par une fonction de la forme:

int pthread_mutexattr_getname(const pthread_attr_t *attr, Type *t); 

où le nom et le type sont définis comme dans l'onglet le 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 
0

L'application NULL à cet argument implique l'utilisation de l'argument par défaut. Donc, pour certaines raisons, vous pouvez vouloir modifier ces paramètres par défaut (en utilisant pthread_mutexattr_init).

La documentation explique tout ce dont vous avez besoin à propos de ces paramètres de mutex.

+3

Si la documentation était utile, la question n'aurait pas besoin d'être posée. :-) J'ai essayé pendant une bonne heure de trouver les réponses à la même question, avant de tomber sur celle-ci. –