2015-02-03 1 views
0

예 (source) :Pthreads - 왜 C 함수가 void *로 선언 되었습니까?

#include <pthread.h> 
#include <stdio.h> 
#define NUM_THREADS  5 

void *PrintHello(void *threadid) 
{ 
    long tid; 
    tid = (long)threadid; 
    printf("Hello World! It's me, thread #%ld!\n", tid); 
    pthread_exit(NULL); 
} 

이 기능은 무효 포인터를 반환하는 선언하지만, 몸에는 return 문이 없다. 여기서 무슨 일이 일어나고있는거야?

일반적으로 함수가 값 (이 경우 void 포인터)을 반환하고 반환 문이없는 것으로 선언 된 경우 해당 동작은 정의되지 않습니다. 댓글 pthread_exit(NULL)return NULL을 호출하는 것과 같습니다. 어떻게 될 수 있습니까? 함수 B()A()에서 호출하여 B()A으로 반환되는 방식으로 호출 할 수 있습니다. return 문은 해당 문이 배치 된 함수를 참조합니다.

+1

'pthread_exit'가 호출자에게 반환되지 않습니다. –

+1

여전히 궁금한 점이 있습니다. 왜 void * return 유형을 지정해야합니까? 왜 그냥 무효가되지 않습니까? –

+0

@ 존 볼링 거 -이게 뭐죠? –

답변

0

우리가 할 수있는 일에 대해서만 추측 할 수 있지만 "Hello, World!" 프로그램에서 합리적인 추측은 해당 함수에 대한 포인터가 pthread_create()으로 전달되도록 의도 된 것입니다. pthread_create()에는 해당 서명이있는 함수에 대한 포인터가 필요합니다. 그렇다고해도 이상한 구조입니다. 그 함수가 단지 NULL을 반환하는 것과 동일하지만 더 명확합니다.

+0

pthread_join()과 관련이 있다고 생각합니다. 문서가 100 % 명확하지 않습니다. –

+0

아니요,'pthread_join()'과 직접 관련이 없습니다. 내가 말했듯이, 함수가 쓰레드의 시작 함수라고 가정한다면, 그 함수는 서명을 가질 필요가있다. 그러나'pthread_exit()'에 전달 된 값 ('pthread_exit()'을 호출하지 않은 함수가 리턴 한 값)이'pthread_join()'의 호출자에게 제공되는 것은 사실입니다. –

+0

음, pthread_join이 없다면, 리턴 타입이나 pthread_exit가 매개 변수를 취할 필요가 없습니다. –

관련 문제