Passage de Tableau en argument d'un nouveau thread en C

Je cherche à passer un tableau en argument d'une fonction dans un nouveau thread à l'aide de pthread_create, est-ce possible? J'ai un tableau d'entiers et de calculer la moyenne de la méthode qui est appelée à partir de la créer de thread méthode mais je n'arrive pas à passer mon tableau dans la méthode correctement. Voici mon code:
int nums[];

int average;

int size = 0;


void *calcAvg(int *nums[]);

int main(int argc, char *argv[]){
    /* initialize an array of the integers to be passed */
    nums[argc - 1];
    for(int i = 0; i < argc - 1; i++){
        nums[i] = atoi(argv[i + 1]);
        size++;
    }

    /* Thread Identifier */
    pthread_t avgThread;

    pthread_create(&avgThread, NULL, calcAvg, nums);

    pthread_join(avgThread, NULL);

    printf("average= %d", average);
}

void *calcAvg(int *nums[]){
    int sum;
    for(int i = 0; i < size; i++){
        sum += nums[i];
    }
    average = sum / (size);
    pthread_exit(0);
}
  • Cette même compiler? nums dans main n'est même pas déclaré correctement, il me semble.
  • Vous devriez vraiment déterminer si vous avez un moment de la compilation, de lien ou de l'exécution problème de temps. Le code ci ne devrait pas être de la compilation sans mise en garde; si elle est, vous avez besoin pour augmenter les mises en garde de niveau sur vos compilations. Et vous devriez résoudre les avertissements; n'oubliez pas, le compilateur C probablement en sait plus sur C que vous faites.
  • La fonction d'un fil doit avoir la signature void *thread_function(void *arg) — une fonction qui prend un " universel pointer (pointeur (pointeur de void) en argument et renvoie un pointeur vers void. Votre calcAvg() fonction ne correspond pas à celle, de sorte que la solution de michaeltang résout ce problème. Il n'y a pas de raison particulière d'utiliser pthread_exit(0); à la fin; étaient-ce qu'il est de mon code, j'utilise return 0; — mais le résultat est le même, sauf que le compilateur ne vais pas me plaindre de ne pas retourner une valeur à partir d'une fonction qui est censé le faire.
  • Au sein de la fonction, la distribution de void * à int * est légitime étant donné que l'entrée était à l'origine une int tableau, qui est d'abord converties en un int pointeur (un pointeur vers le premier élément du tableau), puis à une void pointeur vers match le prototype de fonction. Votre déclaration à l'aide de int *nums[] parvient à utiliser deux niveaux de pointeur à l'endroit où un seul est nécessaire, il vous aurait fait mieux avec int *nums ou int nums[] — il y a l'équivalent dans une déclaration de fonction ou de la définition (mais seulement dans ce contexte d'ailleurs, ils sont assez différentes).
  • Le résidu question est une question de style — et le fil de sécurité. Vous utilisez deux variables globales, size et average. Étant donné que votre thread principal va dormir tout seul enfant thread est en cours d'exécution, il n'y a pas de problème. Si vous aviez deux ou plusieurs threads enfants, vous auriez besoin de s'inquiéter de savoir s'il était sûr d'utiliser les variables. Étant donné que size est fixe une fois le filetage de démarrage (alors qu'ils avaient seulement le lire), alors que ce serait OK. Toutefois, si plusieurs threads accèdent à average, vous avez vraiment besoin d'un mutex ou quelque chose de similaire pour le protéger contre les accès concurrents.
  • Sans doute, avec plusieurs threads, vous feriez mieux de créer une structure pour contenir le nombre d'entiers, un pointeur vers le tableau de nombres entiers, et la moyenne, et puis de passer un pointeur vers une structure distincte pour chaque thread. Bien sûr, vous pouvez simplement utiliser les threads pour calculer la somme et de calculer la moyenne dans le code principal de multiples valeurs renvoyées. Ou vous pourriez trouver une autre façon de gérer le traitement. En général, cependant, si vous avez des threads écrit à une variable globale, vous avez à assurer un accès adéquat avec les mutex ou l'équivalent.
  • Merci @JonathanLeffler qui efface les choses jusqu'à une tonne!