2016-05-18 7 views
2

Also, ich arbeitete an einigen meiner Hausaufgaben und ich stecke auf diesem Seg. Fehler, den ich bekam, als ich pthread_join aufrufen wollte.Segmentierungsfehler bei der Verwendung von pthread_join in C

Ich habe verschiedene Lösungen ausprobiert, einschließlich der Erstellung eines ungültigen Zeigers zum Senden an den Aufruf pthread_join.

Hier ist mein Code:

#include <sys/mman.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <limits.h> 
#include <semaphore.h> 
#include <time.h> 
#include <pthread.h> 

#define NTHREADS 5 
#define NVALORES 1000 
#define NUMBER_PROCURADO 890 

void * run(void *arg); 
void fillVector(); 
int vetor[NVALORES]; 

int main(){ 

    int i, vetor2[NTHREADS]; 
    pthread_t threads[NTHREADS]; 
    fillVector(); 
    for (i = 0; i < NTHREADS; i++){ 
     vetor2[i]=i; 
     threads[i]= pthread_create(&threads[i], NULL, run, &vetor2[i]); 
    } 

    for (i = 0; i < NTHREADS; i++){ 
     pthread_join(threads[i], NULL); 
    } 

    return 0; 
} 

void * run(void * arg){ 
    int *pos = (int *) arg; 

    int i; 
    for (i = NVALORES/NTHREADS*(*pos); i < NVALORES/NTHREADS*((*pos)+1); i++){ 
     if(vetor[i]==NUMBER_PROCURADO){ 
      printf("Found it! Position: %d\n",i); 
     } 
     pthread_exit((void*)pos); 
    } 
    pthread_exit((void*)NULL); 
} 

void fillVector(){ 
    int i; 
    for (i = 0; i < NVALORES; i++){ 
     vetor[i] = i+1; 
    }  
} 
+1

'NVALORES' nicht definiert. –

+0

Es ist eigentlich definiert, nur nicht hier enthalten. –

+0

Es könnte wichtig sein, wenn nicht das eigentliche Problem von Fred beantwortet wird. –

Antwort

5

Sie den Rückgabewert von pthread_create mißbrauchen. Es gibt keine Thread-ID zurück. Es gibt einen Fehlercode zurück, so dass Sie die Thread-ID verwerfen und Ihren pthread_join-Aufruf ungültig machen.

+0

Danke, Problem gelöst! –

+0

Btw, noch eine Frage, auf meinem Freundescomputer läuft Netbeans 8.1 auf Ubuntu das Programm funktioniert und es ist genau kopiert von meiner auf Geany 1,25 ausgeführt eingefügt, irgendeinen Grund dafür? Der verwendete Compiler ist gcc btw. Danke im Voraus. –

+1

Sehr wahrscheinlich undefiniertes Verhalten. Eines der genialen Dinge an UB ist, dass es die Möglichkeit beinhaltet, gut zu arbeiten, Fehler zu teilen oder [nasale Dämonen] herbeizurufen (http://www.catb.org/jargon/html/N/nasal-demons.html). . –