102 votes

PTHREAD_MUTEX_INITIALIZER vs pthread_mutex_init ( &mutex, param)

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 assez sûr si j'utilise uniquement la première méthode ?

NOTE : Ma question concerne principalement de très petits programmes dans lesquels il s'agit tout au plus de connecter plusieurs clients à un serveur et de résoudre leurs demandes à l'aide de fils de travail.

83voto

Jens Gustedt Points 40410

Selon les anciennes versions de la norme POSIX, la première méthode avec un initialisateur n'est garantie de fonctionner qu'avec des variables allouées statiquement, et non lorsque la variable est un auto variable qui est définie dans le corps d'une fonction. Bien que je n'aie jamais vu de plate-forme où cela ne serait pas autorisé, même pour les fonctions auto et cette restriction a été supprimée dans la dernière version de la norme POSIX.

En static est vraiment préférable, car elle permet d'écrire du code d'amorçage beaucoup plus facilement. Chaque fois qu'au moment de l'exécution vous entrez dans un code qui utilise un tel mutex, vous pouvez être assuré que le mutex est initialisé. C'est une information précieuse dans un contexte de multithreading.

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, et pas seulement entre threads.

14voto

Mari202 Points 141

Je voudrais citer ce passage livre :

Con POSIX Il existe deux façons d'initialiser les verrous. La première de le faire est d'utiliser PTHREAD_MUTEX_INITIALIZER comme suit : pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

Ce faisant, le verrou est réglé sur les valeurs par défaut, ce qui rend le verrou utilisable. La manière dynamique de le faire (c'est-à-dire au moment de l'exécution) est d'effectuer 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. Pour en savoir plus sur les attributs vous-même ; en passant NULL, vous utiliserez simplement les valeurs par défaut. Les deux méthodes fonctionnent mais nous utilisons généralement la méthode dynamique (la dernière).

8voto

Joe Points 1932

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

Il n'y a rien de mal à adopter une approche statique, si cela correspond à vos besoins.

6voto

rameshandroid99 Points 11

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

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

L'effet est équivalent à une initialisation dynamique par un appel à pthread_mutex_init() avec le paramètre attrspecifié comme NULL, sauf qu'aucun contrôle d'erreur n'est effectué.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X