为什么pthread_join()的第二个参数是**,指向指针的指针?
我是使用pthread
新手,也不熟悉指针指针。 有人可能会解释为什么pthread_join()
的第二个参数是一个void **
。 为什么这样设计。
int pthread_join(pthread_t thread, void **value_ptr);
要通过函数的参数返回值,您需要传入变量的地址以接收新值。
由于pthread_join()
旨在接收传递给pthread_exit()
的指针值,这是一个void*
,因此pthread_join()
需要void*
的地址,其实际上是void**
类型。
例:
#include /* for EXIT_xxx macros */ #include /* for printf() and perror() */ #include 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 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