2009-11-10 3 views
0

간단한 멀티 스레드 프로그램을 작성하려고했습니다. 그것은 핵심을 버리고 있습니다.멀티 스레드 프로그램에서 코어 덤프

int t; 

for(t=0; t<NUM_THREADS; t++) 
{ 
     printf("Main: creating thread %d\n", t); 
     rc = pthread_create(&thread[t], &attr, BusyWork, (void *)t); 
} 

문제 어디 찾는 제발 도와주세요 : 메인 함수 안에 다음과 같습니다 기능을 앞서 pthread_create

void *BusyWork(void *t) 
{ 
    int i; 
    int *tid; 
    int result=0; 
    tid = t; 

    printf("Thread %d starting...\n",*tid); 
    for (i=0; i<10; i++) 
    { 
     result = result + (i* i); 
    } 
    printf("thread %d is sleeping for %d sec's\n",tid,tid); 
    sleep(tid); 
    printf("Thread %d done. Result = %e\n",tid, result); 
    pthread_exit((void*) t); 
} 

내 전화 : 나는 스레드가 아래를 만들 때 호출되는 내 기능이? 미리 감사드립니다.

답변

0

이 줄은 잘못된 것입니다 :

printf("Thread %d starting...\n",*tid); 

당신은 당신이 원하는 것을 얻을 수 있습니다

printf("Thread %d starting...\n",(int) t); 

또는 의 printf ("스레드 % d 개의 시작 ... \ n을", TID);

+0

고맙습니다. – Vijay

0

이 라인을 시작으로 :

printf("thread %d is sleeping... 

tid에 대한 참조의 모든 *tid을해야합니다.

+0

hi paul ... 이유를 설명해 주시겠습니까? – Vijay

+0

tid는 정수가 아니기 때문에 정수를 가리키는 포인터입니다. C는 정수형과 같은 정도로 관용 적이지만 실제로 출력 값을 얻을 수는 있지만 4 또는 7과 같은 친절한 정수는 아니지만 일부 32 비트 메모리 주소는 4 또는 7. 스레드 프로세스가이 포인터가 가리키는 값을 수정하지 않기 때문에, tid의 선언을'int * tid'에서'int tid'로 변경하고'tid = * t; '를 사용하여 할당하십시오 그것은 그냥 평범한 '친근한 정수입니다. 이것이 코어 덤프를 얻는 이유를 설명하는 것은 아닙니다. – PaulMcG

+0

와우, 내 C 디버깅 기술 * 녹슨! 메인 함수에서 int * value * t를 전달하지만 int * 포인터 *로 역 참조합니다. t는 0에서 NUM_THREADS-1까지의 값을 갖기 때문에 스레드가 첫 번째 printf에서 역 참조를 시도하자마자 블로우 업합니다. 내 대답에서 제안한 변화를 만들지 만,'(void *) t '가 아니라'(void *) & t'를 넘기 위해 호출을 변경한다. 이것은 호출을 t 값이 아닌 t의 주소로 바꾼다. – PaulMcG

관련 문제