web-dev-qa-db-fra.com

PTHREAD_MUTEX_INITIALIZER vs pthread_mutex_init (& mutex, param)

Y a-t-il une différence entre

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

O

pthread_mutex_t lock;
pthread_mutex_init ( &lock, NULL);

Suis-je assez en sécurité si je n'utilise que la première méthode?

NOTE: Ma question concerne principalement de très petits programmes. Dans le meilleur des cas, je vais connecter plusieurs clients à un serveur et résoudre leurs demandes à l'aide de threads de travail.

77
Kalec

Selon les anciennes versions du standard POSIX, la première méthode avec un initialiseur ne pouvait fonctionner qu'avec des variables allouées de manière statique, et non lorsque la variable était une variable auto définie dans un corps de fonction. Bien que je n’aie jamais vu de plate-forme où cela ne serait pas autorisé, même pour les variables auto, cette restriction a été supprimée dans la dernière version du standard POSIX.

La variante static est vraiment préférable si vous le pouvez, car elle permet d’écrire le code bootstrap beaucoup plus facilement. Chaque fois que vous entrez un code qui utilise un tel mutex, vous pouvez soyez 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, telles que le fait d'être récursif, par exemple, ou d'être partageable entre processus, pas seulement entre threads.

63
Jens Gustedt

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

Il n’ya rien de mal à l’approche statique cependant, si cela correspond à vos besoins.

7
Joe

Je voudrais citer ceci de cette livre :

Avec les threads POSIX, il existe deux manières 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 permet de définir les valeurs par défaut du verrou et de le rendre utilisable. La manière dynamique de le faire (c'est-à-dire au moment de l'exécution) est d'appeler 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. Les deux méthodes fonctionnent , mais nous utilisons généralement la méthode dynamique (cette dernière).

3
Mari202

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

Si vous voulez spécifier des attributs pour mutex, allez avec initialisation dynamique ........

L'effet doit être équivalent à l'initialisation dynamique par un appel à pthread_mutex_init () avec le paramètre attrspecified en tant que NULL, à l'exception du fait qu'aucun contrôle d'erreur n'est effectué.

3
Ramesh Miriyala