web-dev-qa-db-de.com

erstellen Sie Thread-Übergabe-Argumente

Ich versuche, mehrere Threads zu erstellen, von denen jeder Thread eine Primzahl berechnet. Ich versuche, ein zweites Argument an eine Funktion zu übergeben, die Thread erstellt. Es wirft ständig Fehler auf.

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

hier ist mein main () mit dem create thread. & primeArray [i] nach & max_prime gibt mir die Fehler.

 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);
}

der Fehler, den ich bekomme, ist:

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â

Es funktioniert gut, wenn ich das zweite Argument herausnehme.

9
user249375

Sie können nur ein einzelnes Argument an die Funktion übergeben, die Sie im neuen Thread aufrufen. Erstellen Sie eine Struktur, die beide Werte enthält, und senden Sie die Adresse der Struktur.

#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
Mankarse

Dies ist der Code von Manakarse , alles ist wirklich gut, aber Sie brauchen einen

pthread_join (Thread [i], NULL)  

um sicherzugehen, dass alle Threads vor dem Ende des Hauptthreads erfolgreich ausgeführt werden ("main wird" warten ", solange alle Threads noch nicht fertig sind) ;

Im Fall von std :: thread kann der Benutzer in der folgenden Methode Argumente an die Thread-Funktion übergeben

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

zum Beispiel, 

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