쓰레드시 pthread_exit으로 pthread_join에 값 넘기는 경우
지금 geekforum에서도 진행되고 있지만 아래의 프로그램 중 포인터에 대
해 정확히 제가 이해 하고 있지 못해서 질문을 올립니다.
pthread_join으로 function 함수에서 pthread_exit()을 이용하여 값
을 넘겨주는 경우, 받는 쪽에서 이중 포인터로 받습니다.
이경우 값을 찍어 줄때 (int)로 타입 캐스팅을 하는데 이 부분이 잘 이해
가 되지 않더라구요.
이 문장을 (int *)라고 해도 문제가 없지만 (int *)&ret라고 하면 안되
더라구요.
전 처음에는 (int) (int *)& 하고 같은 줄 알았는데 아닌거 같은데, 정
확히는 잘몰라서 설명을 구하고자 글을 올렸습니다.
또한 선언을 아예 void **ret로 하면 어떻게 해야 하는지도 궁금하더군
요.
많은 도움 부탁드립니다.
감사합니다.
void *function(void *aaa)
{
int *num = (int *)aaa;
int i = 1;
printf("num [%d]\n", *num);
printf("in thread [%d]\n", i);
pthread_exit((void *)i);
}
int main()
{
pthread_t tid1;
void *ret;
int no = 1;
pthread_create(&tid1, NULL, function, &no);
pthread_join(tid1, &ret);
printf("Return from thread [%d]\n", (int)ret);
return 0;
}
Re: 쓰레드시 pthread_exit으로 pthread_join에 값 넘기는 경우
이중포인터라서 많이 혼동되시는 거 같습니다.
void function에서
i는 int형 변수이네요.
그것을 pthread_exit에 인자로 넣어줄 때 (void *)로 typecast한 이유는
아시겠지만, pthread_exit의 인자가 void *형이기 때문이지요. 그렇다고해
서 (void *)i의 값이 'i의 주소값'이 되는게 아닙니다.
typecast를 한다고 해서 변수의 값이 바뀌는 건 아닙니다. (int) (int *)
& 하고 같은 줄 알았는데 아닌거 같은데라고 하셨는데, 물론 다릅니다.
(int)는 '이 변수는 int형 변수다'라고 컴파일러에게 알리는 것이고
(int *)는 '이 변수는 int형 포인터 변수다'라고 컴파일러에게 알리는 것
이지. 변수의 값이 근본적으로 바뀌진 않습니다.
올리신 소스를 보고 설명을 드리죠. function함수의 마지막에
pthread_exit((void *)i);
이때, 이 pthread_exit함수가 인자로 받는 값은 얼마일까요?
i의 주소값? 아닙니다. 바로 i의 값 1입니다. pthread_exit(1);랑 똑같
은 겁니다.
main함수 맨 마지막에 출력하는 부분에서 (int *)ret라고 해도 문제가 없
는 이유는 (int *)ret의 값이 출력이 되면 ret가 가진 값. 즉, 1이 출력
이 되기 때문입니다. 하지만, (int *)&ret이라고 한다면... &ret. 즉, ret
의 주소값이 출력이 되는 겁니다. typecast는 단지, 컴파일러에서 변수를
어떠한 type으로인식하게 하느냐 하는 것이지, 변수의 값을 바꾸는게 아닙
니다.
Re^2: 쓰레드시 pthread_exit으로 pthread_join에 값 넘기는 경
C에서 변수의 값을 읽는 방법을 잠깐 설명드리면...
메모리 4bytes공간에 다음과 같이 값이 기록되어 있다고 하면,
41 41 00 00 <- 16진수로 표기했습니다.
이 메모리 공간을 unsigned int형 변수가 차지하고 있다고 한다면, 컴파
일러는 이 값을 1x1 + 4x16 + 1x16^2 + 4x16^3 값의 숫자로 인식하게 됩니
다.(x86계열은 little endian이라서 거꾸로 인식합니다.)
반면, char *로 이 메모리 공간을 가리키게 하고 출력시킨다면,
"AA"라고 출력이 됩니다. (문자 'A'는 ascii값 65. 16진수로 41입니다.)
00은 null문자이기 때문에 출력하지 않겠죠.
Re^3: 고맙습니다.
답변고맙습니다.
한동안 답이 올라오지 않아서 저도 한동안 체크 안하다가 들어와보니
답을 올려주셨네요.
많은 도움이 되었습니다.
좋은 하루되세요!!!
댓글 달기