2012-09-08 7 views
2

pthreads 튜토리얼 연습의 일환으로 10 개의 스레드를 결합하는 것보다 10 개의 스레드를 만드는 프로그램을 작성했습니다. 프로그램이 실행되고 출력을 인쇄하지만 pthread_join에 대한 첫 번째 호출에서 세그멘테이션 오류가 발생하는 것처럼 보입니다. 왜 이런 일이 일어나고 있는지 모르겠습니다. 나는 웹에서 검색을 시도했지만 대부분의 문제는 잘못된 포인터가 함수에 전달되는 것과 관련이있다. 이 코드가 내 코드와 동일한 문제인지 쉽게 알 수는 없으므로 확실하지 않습니다. 누군가가 나를 도울 수 있다면pthread_join이 seg 오류를 일으켰습니다

, 나는 확실히

코드는 다음과 같습니다 :) 감사하겠습니다 :

#include <stdio.h> 
#include <pthread.h> 
#define NTHREADS 10 

void *thread_function(void *arg) 
{ 
    int i; 
    int *coming = (int*) arg; 
    for(i=0; i<5; i++) 
     printf("Hello, World (thread %d)\n", *coming); 
    return NULL; 
} 

int main(void) 
{ 
    int i; 
    void *exit_status; 
    int retVal; 
    pthread_t pthread_array[NTHREADS]; 
    int randVals[10] = {23,5,17,55,9,47,69,12,71,37}; 

    printf("threads are created\n"); 
    for(i=0; i<10; i++) 
    { 
     retVal=pthread_create(&pthread_array[i], NULL, thread_function, &randVals[i]); 
     printf("pthread_create %d retVal=%d\n", i, retVal); 
    } 

    printf("threads are joined\n"); 
    for(i=0; i<10; i++) 
    { 
     retVal= pthread_join(pthread_array[i], &exit_status); 
     printf("pthread_join %d retVal=%d and exit_status=%d\n", i, retVal, 
     *((int *)exit_status)); 
    } 

    printf("all threads have ended\n"); 
    return 0; 
} 

답변

0

printf("pthread_join %d retVal=%d and exit_status=%d\n", i, retVal, 
    *((int *)exit_status)); 

스레드 함수는 NULL을 반환 문제이며, 그래서 이것은 exit_status에 저장된 값입니다. 그래서 지금에 printf

*((int *)exit_status 

당신이 그것을 역 참조 다음 INT의 *이 NULL 포인터를 캐스팅되어 않습니다. NULL 포인터를 역 참조하는 것은 좋은 생각이 아닙니다. 스레드 기능은 (는 않는)를 NULL을 반환하는 경우 exit_statusWhat does exactly the "status" in pthread_join represent and how to query it

0
*((int *)exit_status)); 

을 사용하는 방법에 대한 풀러 예를 들어이 질문을 참조,이는 역 참조하려고합니다. 그렇게하기 전에 exit_status을 테스트해야합니다 :

pthread_join(...); 
if (exit_status != NULL) 
    /* Safe to use. */ 
+0

우 ... 그걸 테스트 해 봤어야합니다. – SmalekTF