2017-11-10 13 views
1

pthread을 처음 사용하고 있으며 포인터에 대한 포인터에 익숙하지 않습니다. 누군가 pthread_join()의 두 번째 인수가 void ** 인 이유를 설명 할 수 있습니다. 왜 이런 식으로 설계 되었습니까?pthread_join()의 두 번째 인수가 포인터 인 포인터 ** 인 이유는 무엇입니까?

int pthread_join(pthread_t thread, void **value_ptr); 
+0

가 pthread_exit'때문에 (보이드 RETVAL *)'와 pthread_join을()가 '실패를 통신 할 수 있어야한다. – EOF

답변

2

함수의 인수를 통해 값을 반환하려면 새 값을 받기 위해 변수의 주소를 전달해야합니다. pthread_join()로서

pthread_join() 사실 void** 유형의 인 void*의 주소를 예상하는 것이다 void*pthread_exit()에 전달되는 포인터 값을 수용하도록 설계된다.

예 :

#include <stdlib.h> /* for EXIT_xxx macros */ 
#include <stdio.h> /* for printf() and perror() */ 
#include <pthread.h> 

void * tf(void * pv) 
{ 
    int * a = pv; 
    size_t index = 0; 

    printf("tf(): a[%zu] = %d\n", index , a[0]); 

    ++index; 

    pthread_exit(a + index); /* Return from tf() the address of a's 2nd element. 
          a + 1 here is equivalent to &a[1]. */ 
} 


int main(void) 
{ 
    int a[2] = {42, 43}; 
    pthread_t pt; 
    int result = pthread_create(&pt, NULL, tf, a); /* Pass to tf() the address of 
                a's 1st element. a decays to 
                something equivalent to &a[0]. */ 
    if (0 != result) 
    { 
    perror("pthread_create() failed"); 
    exit(EXIT_FAILURE); 
    } 

    { 
    int * pi; 
    size_t index = 0; 

    { 
     void * pv; 
     result = pthread_join(pt, &pv); /* Pass in the address of a pointer-variable to 
             to where the value passed to pthread_exit() 
             should be written. */ 
     if (0 != result) 
     { 
     perror("pthread_join() failed); 
     exit(EXIT_FAILURE); 
     } 

     pi = pv; 
    } 

    ++index; 

    printf("main(): a[%zu] = %d\n", index, pi[0]); 
    } 

    return EXIT_SUCCESS; 
} 

상기 인쇄 예상되는 프로그램 :

tf(): a[0] = 42 
main(): a[1] = 43 
+0

많은 시간을내어 감사드립니다. –