쓰레드시 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;
}

익명 사용자의 이미지

이중포인터라서 많이 혼동되시는 거 같습니다.
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으로인식하게 하느냐 하는 것이지, 변수의 값을 바꾸는게 아닙
니다.

익명 사용자의 이미지

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문자이기 때문에 출력하지 않겠죠.

익명 사용자의 이미지

답변고맙습니다.

한동안 답이 올라오지 않아서 저도 한동안 체크 안하다가 들어와보니

답을 올려주셨네요.

많은 도움이 되었습니다.

좋은 하루되세요!!!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.