2017-02-26 5 views
-1

Hier ist mein Code, ich kann den Fehler für paar Stunden nicht finden. Ich führe es auf Bash, und es gibt die korrekte Fibonacci-Ausgabe mit Segmentierungsfehler 11 am Ende der Zeile. Aber wenn ich Xcode verwende, um es auszuführen, gibt es keinen solchen Segmentierungsfehler, aber mit normalem Return 0 am Ende.Segmentierungsfehler 11 in C-Sprache Pthread-Programm

Grundsätzlich erstelle ich einen Pthread, um die Funktion zu berechnen berechnen und nachdem es fertig ist, führe ich die Anzeige im Hauptthread.

Ich schätze Ihre Zeit.

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

void *calculate(int n, int *arr) 
{ 
    for (int i = 0; i <= n; i++) 
    { 
     if (i == 1) 
      arr[i] = 1; 
     else if (i > 1) 
      arr[i] = arr[i - 1] + arr[i - 2]; 
    } 
    return NULL; 
} 

void display(int n, const int *arr) 
{ 
    for (int i = 0; i <= n; i++) 
    { 
     printf("%d ",arr[i]); 
    } 
} 

int main(int argc, const char* argv[]) 
{ 
    if (argc != 2) 
    { 
     printf("Wrong argument. You need ONE positive number as argument."); 
     return 1; 
    } 
    int number = atoi(argv[1]); 
    if (number < 0) 
    { 
     printf("Plese enter a positive integer."); 
     return 2; 
    } 
    else if (number == 0) 
    { 
     printf("0"); 
     return 0; 
    } 
    int *arr = (int*)malloc((number+1) * sizeof(int)); 
    arr[0] = 0; 
    pthread_attr_t attr; 
    pthread_t thread; 
    pthread_attr_init(&attr); 
    pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); 
    pthread_create (&thread, &attr, calculate(number, arr), NULL); 
    display(number, arr); 
    free(arr); 
    return 0; 
} 
+0

Haben Sie versucht, Ihrem Thread vor dem Beenden beizutreten? –

Antwort

0

Siehe folgende pthread_create Dokumentation (http://man7.org/linux/man-pages/man3/pthread_create.3.html):

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
        void *(*start_routine) (void *), void *arg); 

Beachten Sie die Argumente für die start_routine in der 'arg' platziert sind param - ein Anruf nicht die Funktion direkt mit Argumenten:

Die Funktion pthread_create() startet einen neuen Thread im aufrufenden Prozess. Der neue Thread startet die Ausführung durch Aufruf von start_routine(); Als einziges Argument von start_routine() wird arg übergeben.

Als abschließende Bemerkung, sollten Sie wirklich den Faden (pthread_join) anschließen, bevor Sie Speicher zu sehen versuchen, es für mutierenden verantwortlich ist:

int pthread_join(pthread_t thread, void **retval); 
+0

Danke, meine Frage ist fast zu lösen. Die letzte Frage ist, wie übergebe ich nur ein Argument an diese Funktion, d. H. Das int * arr? Da das Format der Funktion pthread_create nur eine Funktion mit dem Argument void * type akzeptiert. –

+0

void * berechnen (void * arg) {int * arr = (int *) arg; gelöst. Vielen Dank! –

+0

Der einfachste Weg besteht darin, eine Struktur zu erstellen, deren Adresse auf einen void-Zeiger für 'args' verweist. In der Funktion wird dann in den richtigen Struktur-Zeigertyp zurückgeworfen. – Squirrel

0

auf Eichhörnchen Antwort zu erweitern. Sie müssen eine tatsächliche Funktion an pthread_create übergeben, um sie nicht in der Argumentliste aufzurufen. Ansonsten wird nicht nur die Funktion im Haupt-Thread ausgeführt, sondern auch ihr Rückgabewert wird an pthread_create übergeben. Die Funktion gibt void* zurück, sodass kein Kompilierungsfehler auftritt.

Sie sollten eine Funktion definieren, die ein einzelnes Zeigerargument verwendet und void * zurückgibt und das als drittes Argument übergibt. Um die Parameter zu übergeben, können Sie dann eine Struktur definieren, die die erforderlichen Werte enthalten und als letztes Argument an pthread_create einen Zeiger übergeben kann.

Innerhalb Ihrer Thread-Funktion können Sie zum richtigen Zeigertyp zurückkehren und die Werte lesen und in Ihrer Thread-Funktion verwenden.

Hier ist ein vollständiges Beispiel, das zeigt, wie Sie die verschiedenen Parameter umbrechen und an pthread_create übergeben werden.

Ich habe gerade eine Struktur erstellt, die die erforderlichen Parameter enthält, und eine erstellt, die an pthread_create übergeben wird. In der Thread-Funktion werfen Sie sie zurück auf den realen Typ und lesen die Werte.

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

struct params 
{ 
    int n; 
    int* arr; 
}; 

void calculate(int n, int *arr) 
{ 
    for (int i = 0; i <= n; i++) 
    { 
     if (i == 1) 
      arr[i] = 1; 
     else if (i > 1) 
      arr[i] = arr[i - 1] + arr[i - 2]; 
    } 
} 

// wrapper to pass function to thread 
void* calcwrap(void* data) 
{ 
    struct params* p = (struct params*)data; 
    calculate(p->n, p->arr); 
    return NULL; 
} 

void display(int n, const int *arr) 
{ 
    for (int i = 0; i <= n; i++) 
    { 
     printf("%d ",arr[i]); 
    } 
} 

int main(int argc, const char* argv[]) 
{ 
    if (argc != 2) 
    { 
     printf("Wrong argument. You need ONE positive number as argument."); 
     return 1; 
    } 
    int number = atoi(argv[1]); 
    if (number < 0) 
    { 
     printf("Plese enter an integer."); 
     return 2; 
    } 
    else if (number == 0) 
    { 
     printf("0"); 
     return 0; 
    } 
    int *arr = malloc((number+1) * sizeof(int)); 
    arr[0] = 0; 

    struct params thread_params = {number, arr}; 
    pthread_attr_t attr; 
    pthread_t thread; 

    pthread_attr_init(&attr); 

    pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); 
    pthread_create (&thread, &attr, calcwrap, &thread_params); 
    pthread_join(thread, NULL); 

    display(number, arr); 
    free(arr); 

    return 0; 
} 
Verwandte Themen