create thread - passing arguments

c, function, multithreading, parameter-passing

Solution

You can only pass a single argument to the function that you are calling in the new thread. Create a struct to hold both of the values and send the address of the struct.

#include <pthread.h>
#include <stdlib.h>
typedef struct {
    //Or whatever information that you need
    int *max_prime;
    int *ith_prime;
} compute_prime_struct;

void *compute_prime (void *args) {
    compute_prime_struct *actual_args = args;
    //...
    free(actual_args);
    return 0;
}
#define num_threads 10
int main() {
    int max_prime = 0;
    int primeArray[num_threads];
    pthread_t primes[num_threads];
    for (int i = 0; i < num_threads; ++i) {
        compute_prime_struct *args = malloc(sizeof *args);
        args->max_prime = &max_prime;
        args->ith_prime = &primeArray[i];
        if(pthread_create(&primes[i], NULL, compute_prime, args)) {
            free(args);
            //goto error_handler;
        }
    }
    return 0;
}

Problem

I am attempting on creating multiple threads that each thread calculates a prime. I am trying to pass a second argument to a function using thread create. It keeps throwing up errors. ``` void* compute_prime (void* arg, void* arg2) { ``` here is my main() with the create thread. &primeArray[i] after &max_prime is giving me the errors. ``` for(i=0; i< num_threads; i++) { primeArray[i]=0; printf("creating threads: \n"); pthread_create(&primes[i],NULL, compute_prime, &max_prime, &primeArray[i]); thread_number = i; //pthread_create(&primes[i],NULL, compPrime, &max_prime); } /* join threads */ for(i=0; i< num_threads; i++) { pthread_join(primes[i], NULL); //pthread_join(primes[i], (void*) &prime); //pthread_join(primes[i],NULL); //printf("\nThread %d produced: %d primes\n",i, prime); printf("\nThread %d produced: %d primes\n",i, primeArray[i]); sleep(1); } ``` the error i get is: ``` myprime.c: In function âmainâ: myprime.c:123: warning: passing argument 3 of âpthread_createâ from incompatible pointer type /usr/include/pthread.h:227: note: expected âvoid * (*)(void *)â but argument is of type âvoid * (*)(void *, void *)â myprime.c:123: error: too many arguments to function âpthread_createâ ``` It works fine if i take out the second argument.

Original source