Je tente de créer plusieurs threads que chaque thread calcule un nombre premier. J'essaye de passer un deuxième argument à une fonction en utilisant thread create. Il continue à générer des erreurs.
void* compute_prime (void* arg, void* arg2)
{
voici ma main () avec le thread de création. & primeArray [i] after & max_prime me donne les erreurs.
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);
}
l'erreur que j'obtiens est:
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â
Cela fonctionne bien si je retire le deuxième argument.
Vous ne pouvez transmettre qu'un seul argument à la fonction que vous appelez dans le nouveau thread. Créez une structure pour contenir les deux valeurs et envoyez l'adresse de la 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;
}
C’est le code de Manakarse , tout est vraiment bien mais vous avez besoin d’un
pthread_join (thread [i], NULL)
juste pour être sûr que tous les threads seront exécutés avec succès avant la fin du thread principal ("main" attend "alors que tous les threads ne sont pas encore terminés) ;
Dans le cas de std :: thread, l'utilisateur peut passer des arguments à la fonction de thread dans la méthode suivante
std :: thread (funcName, arg1, arg2);
par exemple,
//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);