2016-05-18 4 views
2

私は宿題の一部を取り組んでいましたが、私はこのsegに固執しています。私はpthread_joinを呼び出そうとしています。Cでpthread_joinを使用した場合のセグメンテーションフォルト

私はpthread_join呼び出しに送るvoidポインタの作成を含むさまざまな解決策を試しました。

#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」は定義されていません。 –

+0

実際に定義されていますが、ここには含まれていません。 –

+0

Fredが本当の問題に答えることが重要ではないかもしれません。 –

答えて

5

あなたはpthread_createの戻り値を悪用している:

は、ここに私のコードです。スレッドIDは返されません。エラーコードを返すので、スレッドIDを壊してpthread_join呼び出しを無効にします。

+0

ありがとう、問題は解決しました! –

+0

Btw、もう1つの質問、私の友人のコンピュータ上でUbuntu上でNetbeans 8.1を実行していて、プログラムが動作しています.Geany 1.25上で実行されている私のペーストコピーです。使用されるコンパイラはgcc btwです。前もって感謝します。 –

+1

未定義の可能性が最も高いUBについてのすばらしいことの1つは、うまく働いたり、鼻の悪魔を召喚したり、召喚したりする可能性があるということです(http://www.catb.org/jargon/html/N/nasal-demons.html) 。 –

関連する問題