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

问题描述 投票:0回答:2

我刚开始使用

pthread
,而且对指向指针的指针也不太熟悉。有人可以解释为什么
pthread_join()
的第二个参数是
void **
吗?为什么要这样设计呢。

int pthread_join(pthread_t thread, void **value_ptr);
c pointers pthreads pass-by-value pointer-to-pointer
2个回答
11
投票

要通过函数的参数返回值,您需要传入变量的地址以接收新值。

由于

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() 旨在在目标线程的返回地址(由 pthread_exit() 建立)和传递给 pthread_join() 的指针地址之间建立连接。

我说连接的原因是因为这两个函数目标相同,但它们不是同一个函数!它们是2个不同的功能!!!

基本上让我们显示 pthread-join() 的一行。

int pthread_join(pthread_t thread, void **value_ptr){ ... *value_ptr=<the address you gave to pthread_exit()>; ... }

© www.soinside.com 2019 - 2024. All rights reserved.