Create stream - passing arguments

I am trying to create multiple threads that each thread calculates a prime. I am trying to pass the second argument to a function using thread creation. It continues to cause errors.

void* compute_prime (void* arg, void* arg2) { 

here is my main () with thread creation. & primeArray [i] after & max_prime gives me 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.

+9
source share
3 answers

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

 #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; } 
+16
source

In the case of std :: thread, the user can pass arguments to the thread function in the following method

std :: thread (function_name, arg1, arg2);

eg,

 //for a thread function, void threadFunction(int x,int y){ std::cout << x << y << std::endl; } // u can pass x and y values as below std::thread mTimerThread; mTimerThread = std::thread(threadFunction,1,12); 
0
source

This is the Manacarse code, everything is really good, but you need

pthread_join (thread [I], NULL)

just to be sure that all threads will succeed before the main thread completes ("main will" wait "until all threads have completed);

0
source

All Articles