2016-07-20 10 views
0

Ich brauche einen Haupt-Thread erstellen neue Threads, die jeweils ein Array von Primfaktoren eines Werts an sie zurückgegeben. Wenn beispielsweise ein neuer Thread 12 übergeben wird, muss er ein Array, das 223 enthält, an den Hauptthread zurückgeben. Da mein Code momentan steht, bekomme ich immer einen Segmentierungsfehler. Ich bin mir nicht sicher, wie man Werte von einem neuen Thread zum Hauptthread zurückgibt. Gibt es Hilfe, um herauszufinden, was den Segmentierungsfehler verursacht und wie man Werte an einen Hauptthread zurückgibt?Multithread Primefactorization mit POSIX

#include <pthread.h> 
#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 
#include <string.h> 


void *trial_division(void *n); 
int main (int argc, char** argv[]) 
{ 
while(argc > 0){ 
pthread_t tid; 
pthread_create(&tid,NULL,trial_division,argv[argc]); 
pthread_join(tid,NULL); 
argc--; 
} 

}//end main 
void *trial_division(void *n) 
{ 
printf("I'm a new thread!\n"); 
int value = atoi(n); 
while (value%2 == 0) 
{ 
    printf("%d",2); 
    value = value/2; 
} 
for (int i = 3;i <= sqrt (value); i = i+2) 
{ 
    while (value%i == 0) 
    { 
      printf("%d",i); 
      value = value/i; 
    } 
} 
if (value > 2) 
    printf("%d",value); 
printf("\n"); 
}//end trail_division 
+0

Die segfault wird verursacht durch argv mit argc Wert dereferenzieren. Die Array-Indizierung beginnt mit Null, dh nach dem Ersetzen von 'argv [argc] 'durch' argv [argc-1]' gibt es keinen segfault. – yanpas

Antwort

0

ersten Blick auf den Code-Probleme Lassen Sie uns:

  • Das zweite Argument von int main(int, char***) sollte char ** sein.
  • Die erste Zeichenfolge in argv [] ist der Name der ausführbaren Datei, Sie möchten also while (argc>1) {.
  • Mit atoi(n) Sie haben eine ungültige Konvertierung von ‚void *‘ auf ‚const char *‘, also lassen Sie uns diese Stimmen: atoi((char*) n)
  • Schließlich haben Sie keine return-Anweisung in der Funktion nicht nichtig zurück. Nur return NULL;

Jetzt die Segmentierung Fehler. Es passiert, weil der erste Thread mit dem Argument argv[argc] erstellt wird, das nicht existieren kann, da Array-Indizes auf Null basieren. Wenn Sie es also in argv[argc-1] ändern, wird Ihr Code (plus die obigen Änderungen) funktionieren.

korrigierten Code:

#include <pthread.h> 
#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 
#include <string.h> 

void *trial_division(void *n); 

int main(int argc, char* argv[]) { 
    while (argc > 1) { 
     pthread_t tid; 
     pthread_create(&tid, NULL, trial_division, argv[argc-1]); 
     pthread_join(tid, NULL); 
     argc--; 
    } 

} //end main 
void *trial_division(void *n) { 
    printf("I'm a new thread!\n"); 
    int value = atoi((char*) n); 
    while (value % 2 == 0) { 
     printf("%d", 2); 
     value = value/2; 
    } 
    for (int i = 3; i <= sqrt(value); i = i + 2) { 
     while (value % i == 0) { 
      printf("%d", i); 
      value = value/i; 
     } 
    } 
    if (value > 2) 
     printf("%d", value); 
    printf("\n"); 

    return NULL; 
} //end trail_division 

Beispiel Ausgang:

$ ./test 123 45 6789 
I'm a new thread! 
33173 
I'm a new thread! 
335 
I'm a new thread! 
341