Bibliothèque Linux Pthread, arguments de thread

Si je crée un fil à l’aide de la bibliothèque Pthread sous Linux, je dois utiliser la fonction pthread_create , qui est l’un des arguments suivants: void * , afin de pouvoir passer un pointeur sur quelque chose, afin que ma routine de fil puisse y accéder, mais est-elle sécurisée faire quelque chose comme ça

 {//some scope int a=5//scope variable pthread_create(&id,NULL,some_function,(void*)a); }//end of scope 

et dans ma routine:

 void *some_function(void *_arg) { int a=(int)arg; return NULL; } 

Je veux faire quelque chose comme ceci, afin de pouvoir conserver la valeur d’une variable sur la stack afin de pouvoir y accéder à partir de ma routine de thread, mais je ne souhaite pas créer de structure pour une seule variable ni allouer manuellement de la mémoire.

Je vais créer quelques threads comme celui-ci, donc je voulais savoir si, dans une situation comme celle-ci, je pouvais me débrouiller sans utiliser list ou tableau dynamic.

Ce que vous faites est parfaitement sûr dans le monde réel: la conversion entre int et void * n’est pas un comportement indéfini, elle est définie par l’implémentation et toutes les implémentations le définissent de manière naturelle et sensée. C’est également le seul moyen efficace de passer des arguments d’entier unique à un nouveau thread. D’autres approches nécessitent toutes une synchronisation coûteuse, soit via un locking explicite, soit en utilisant malloc dans le thread d’origine et free dans le nouveau thread (ce qui implique un coût de synchronisation implicite caché dans l’implémentation malloc / free ).

Vous découvrirez cependant que certains compilateurs émettent des avertissements pour la conversion. Ceci est dû au vieux code cassé qui suppose que int peut représenter l’ensemble des valeurs de void * ; le compilateur est incapable de faire la distinction entre la pratique (valide) de stocker un int dans un void * et la pratique (non valide) de stocker un void * dans un int . En guise de solution, vous pouvez utiliser intptr_t au lieu de int , ce qui évitera l’avertissement. Si vos variables d’origine sont int , append simplement une intptr_t intermédiaire supplémentaire via intptr_t évitera les avertissements.

Dans ce cas, il est prudent de transmettre la valeur de a à la stack de some_function via l’argument arg , car la taille de void* est suffisamment grande pour prendre en charge la valeur d’un entier.