pthread_join()函数中第二个参数为什么是一个指向指针的指针**?

14

我刚开始使用pthread,对指向指针也不是很熟悉。有没有人可以解释一下为什么pthread_join()的第二个参数是void **?为什么会设计成这样。

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

1
因为 pthread_exit(void* retval);pthread_join() 应该能够传达失败信息。 - EOF
2个回答

12

如果你想通过函数参数返回一个值,你需要传入变量的地址来接收新值。

由于pthread_join()是设计用来接收指向pthread_exit()传递的指针值的,该指针值是一个void*类型,因此pthread_join()需要一个void*类型的地址,实际上是void**类型。

示例:

#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[index]);

  ++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 
                                         pointing 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
基本上,pthread_join() 通过它的 void **value_ptr 将 void *joinPointer 和 void *exitPointer 连接起来。
// void *joinPointer; (the pointer you gave to pthread_join)
// void *exitPointer; (the pointer you gave to pthread_exit)

void pthread_exit(void *retval);

int pthread_join(pthread_t thread, void **value_ptr){
       ...
       *value_ptr = <retval>;    //retval points to what exitPointer pointed to
       ...
}

int main(){
       ...
       void *joinPointer;
       ...
       pthread_join(ithread, &joinPointer)
       ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接