Je crée un fichier c pour une file d'attente de répartition qui obtient une tâche et la place dans une file d'attente qui est la liste liée. Pour ce faire, je dois créer des threads en utilisant
pthread_t cThread;
if(pthread_create(&cThread, NULL, work, param)){
perror("ERROR creating thread.");
}
Cependant, je dois créer une autre fonction qui va dans la variable 'work' et 'param' comme paramètres de la fonction create. Mon ami m'a dit que j'avais juste besoin de mettre n'importe quel code dans la fonction de travail qui boucle à l'infini pour que le thread ne meure pas. Quelqu'un peut-il expliquer que chaque paramètre entre dans le pthread_create
fonction - spécialement pour work
et param
? J'ai cherché sur Google pour cela, mais la plupart des tutoriels sont si difficiles à comprendre le concept ...
Les quatre paramètres pour pthread_create
sont, dans l'ordre:
Un pointeur vers un pthread_t
structure, qui pthread_create
remplira avec des informations sur le fil qu'il crée.
Un pointeur vers un pthread_attr_t
avec des paramètres pour le thread. Vous pouvez simplement passer NULL
en toute sécurité la plupart du temps.
Une fonction à exécuter dans le thread. La fonction doit renvoyer void *
et prenez un void *
argument, que vous pouvez utiliser comme bon vous semble. (Par exemple, si vous démarrez plusieurs threads avec la même fonction, vous pouvez utiliser ce paramètre pour les distinguer.)
Le void *
avec lequel vous souhaitez démarrer le fil. Passez NULL
si vous n'en avez pas besoin.
clarifier la réponse de duskwuff:
Le paramètre work
est un pointeur de fonction. La fonction doit prendre un argument qui est indiqué comme type void *
et valeur de retour void *
.
param
devrait être un pointeur vers les données que work
recevra.
À titre d'exemple, disons que vous souhaitez passer deux int au travailleur. Ensuite, vous pouvez créer quelque chose comme ceci:
int *param = (int *)malloc(2 * sizeof(int));
param[0] = 123;
param[1] = 456;
pthread_create(&cThread, NULL, work, param);
Ensuite, votre fonction de travail peut convertir le type de pointeur et récupérer les données param:
void *work(void * parm) {
int *param = (int *)parm;
int first_val = param[0];
....
}
Vous pouvez faire des choses plus complexes, comme créer une structure avec toutes les données dont vous avez besoin pour passer.