2012-10-13 4 views
0

pthread 라이브러리로 스레드를 생성하려고합니다. gcc -o -pthread 파일 file.c로 컴파일해도 괜찮습니다.런타임 오류 - POSIX 스레드

그러나 코드를 실행할 때 세그먼트 오류가 발생합니다. 문제가 무엇인지 잘 모르겠습니다. 나는 시도하고 배우기 위하여 교과서에서 주어진 부호를 실행하는 것을 시도했다 그러나 나는 지금 분실된다. 누구든지 도와 줄 수 있습니까? 코드는 아래에 있습니다. 아주 기본적입니다. 그렇지만 나를 끌어 들여주세요.

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

int sum; 
void *runner(void *param); 

int main (int argc, char *argv[]) 
{ 
    pthread_t tid; 
    pthread_attr_t attr; 
    //printf("Am I here..?\n"); 
    if (argc!=2) 
    { 
     fprintf(stderr, "usage: a.out ...\n"); 
     return -1; 
    } 

    if (atoi(argv[1] < 0)) 
    { 
     fprintf(stderr, "%d must be >= 0\n", atoi(argv[1])); 
     return -1; 
    } 



    pthread_attr_init(&attr); 
    pthread_create(&tid, &attr, runner, argv[1]); 
    pthread_join(tid, NULL); 

    printf("sum = %d\n", sum); 
} 

void *runner(void *param) 
{ 
    extern int sum; 
    int i, upper=atoi(param); 
    sum=0; 

    for(i=1; i<= upper; i++) 
     sum+=i; 

    pthread_exit(0); 
} 
+0

디버거 사용 방법을 배우는 것이 좋습니다. 리눅스에서'gdb'가 선택 도구가 될 것입니다. 'gdb'를 사용했다면 조용한 짧은 시간에 쉽게이 오류를 발견했을 것입니다. – alk

+0

또한 모든 경고를 켜기 위해'-Wall' 옵션을 사용하여 컴파일하는 것이 좋습니다. 특정 경우에는 컴파일러가 인쇄하는 경고가 핵심 코드 라인을 직접 지적했을 것입니다. 사용해보십시오. ;-) – alk

답변

1

당신은 브래킷을 잘못 배치 :

변경 :

if (atoi(argv[1] < 0)) 

에 :

if (atoi(argv[1]) < 0) 
+0

고마워요! 나는 그것이 매우 어리석은 것이라고 생각했습니다 ... 디버거가이 모든 작은 것들을 식별하도록 도울까요? – plaknas

+0

예, 어떤 줄이 당신에게 segfault를 제공하는지 확인할 수 있습니다. :) –

3

켜고 조심스럽게 컴파일러의 경고를 검토하십시오.

당신은 stdlib.h을 포함하지 않는

, 그래서 atoi는 선언되지 않은, 당신은 runner에서 아무것도를 보내고하지 return있어하지만 당신은 void*을 반환로 선언했습니다.

if (atoi(argv[1] < 0)) 

argv[1] < 00 또는 1로 평가됩니다, 당신은 atoi에 인수로하지 무엇 :

는하지만 큰 문제는이 라인입니다. 원하는 내용은 다음과 같습니다.

if (atoi(argv[1]) < 0) 

올바른 경고를 사용하면 컴파일러가 이러한 모든 문제를 나타낼 가능성이 있습니다.