web-dev-qa-db-fra.com

C, comment créer un fil en utilisant la fonction pthread_create

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 ...

18
Leanne

Les quatre paramètres pour pthread_create sont, dans l'ordre:

  1. Un pointeur vers un pthread_t structure, qui pthread_create remplira avec des informations sur le fil qu'il crée.

  2. 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.

  3. 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.)

  4. Le void * avec lequel vous souhaitez démarrer le fil. Passez NULL si vous n'en avez pas besoin.

33
duskwuff

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.

21
Foo Bah