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.
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.
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.
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'utiliserPTHREAD_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).
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é.