PTHREAD_MUTEX_INITIALIZER contre pthread_mutex_init (& mutex, param)

89

Y a-t-il une différence entre

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Ou

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

Suis-je suffisamment en sécurité si j'utilise uniquement la première méthode?

REMARQUE: Ma question se réfère principalement à de très petits programmes où, au maximum, je vais connecter plusieurs clients à un serveur et résoudre leurs demandes avec des threads de travail.

Kalec
la source

Réponses:

72

Dans les anciennes versions de la norme POSIX, la première méthode avec un initialiseur est garantie de fonctionner uniquement avec des variables allouées statiquement, pas lorsque la variable est une autovariable définie dans un corps de fonction. Bien que je n'ai jamais vu une plate-forme où cela ne serait pas autorisé, même pour les autovariables, et cette restriction a été supprimée dans la dernière version du standard POSIX.

La staticvariante est vraiment préférable si vous le pouvez, car elle permet d'écrire du code bootstrap beaucoup plus facilement. Chaque fois qu'au moment de l'exécution, vous entrez dans un code utilisant un tel mutex, vous pouvez être assuré que le mutex est initialisé. Il s'agit d'une information précieuse dans un contexte multi-threading.

La méthode utilisant une fonction init est préférable lorsque vous avez besoin de propriétés spéciales pour votre mutex, comme être récursif par exemple ou être partageable entre processus, pas seulement entre threads.

Jens Gustedt
la source
8

Vous pouvez définir plus d'attributs du mutex avec l'initialisation dynamique, et vous ne pouvez utiliser la méthode dynamique que si vous ajoutez un tas de mutex au moment de l'exécution.

Il n'y a cependant rien de mal avec l'approche statique, si cela répond à vos besoins.

Joe
la source
"De plus, vous ne pouvez utiliser la méthode dynamique que si vous ajoutez un tas de mutex au moment de l'exécution. " Alors, qu'est-ce que cela signifie? Un petit exemple si ce n'est pas facile à expliquer?
Kalec
1
@Kalec: si votre mutex est alloué par malloc()(ou appartient à un objet alloué).
Michael Burr le
3
@Kalec si la variable mutex "lock" fait partie d'une structure, alors on ne peut pas suivre la 1ère approche. nous devons utiliser pthread_init ().
pankaj kushwaha
7

Je voudrais citer ceci de ce livre :

Avec les POSIXthreads, il existe deux façons d'initialiser les verrous. Une façon de faire est d'utiliser PTHREAD_MUTEX_INITIALIZER, comme suit: pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Cela définit le verrou sur les valeurs par défaut et rend ainsi le verrou utilisable. La manière dynamique de le faire (c'est-à-dire au moment de l'exécution) est de faire un appel à pthread_mutex_init()comme suit: int rc = pthread_mutex_init(&lock, NULL); assert(rc == 0); // always check success!

Le premier argument de cette routine est l'adresse du verrou lui-même, tandis que le second est un ensemble facultatif d'attributs. En savoir plus sur les attributs vous-même; passer NULL utilise simplement les valeurs par défaut. Dans les deux cas, cela fonctionne , mais nous utilisons généralement la méthode dynamique (dernière).

Mari202
la source
4

Dans les cas où les attributs mutex par défaut sont appropriés, la macro PTHREAD_MUTEX_INITIALIZER peut être utilisée pour initialiser les mutex.

Si vous souhaitez spécifier des attributs pour le mutex, utilisez l'initialisation dynamique ........

L'effet doit être équivalent à une initialisation dynamique par un appel à pthread_mutex_init () avec le paramètre attr spécifié comme NULL, sauf qu'aucune vérification d'erreur n'est effectuée.

Ramesh Miriyala
la source