2

我不明白为什么 doespthread_join需要作为返回值的第二个参数void**,而pthread_exit给定返回值的返回值参数为void*.

4

2 回答 2

4

pthread_join 等待线程结束,pthread_exit 的结果值存储到 *value_ptr。如果要忽略结果,可以为 value_ptr 传递 NULL。这是通过将指针传递给变量来模拟按引用传递的常见 C 实践。请参阅在 C 中通过引用传递

pthread_join 在成功时返回 0 作为函数返回值;那么你就知道线程已经加入了,你可以从 *value_ptr 访问值。

void *value = NULL;
if (pthread_join(thread, &value) == 0) {
    // thread has ended, and the exit value is available in
    // the value variable
} 
于 2012-10-13T10:58:33.923 回答
2

本质上,pthread_join()想要返回两个信息:

  • 成功/失败指示
  • 无论线程返回什么(它有一个 type void*

在 C 语言中,函数“返回”两个单独值的典型方式是让函数正常返回其中一个值,并在调用者提供的位置“返回”另一个值,调用者在该位置传递指向该位置的指针. 所以pthread_join()

  • 返回成功/失败作为函数的值
  • 在调用者提供的位置返回线程的void*结果,调用者将 a 传递void**到该位置。

请注意,在pthread_join()' 的情况下,调用者提供的位置是可选的。可以在调用者对该结果不感兴趣的 id 中传递 NULL。使调用者提供的位置可选是一种常见的,绝不是普遍的习语。

pthread_exit()不需要使用 avoid**作为它的参数,因为该参数不是函数的结果。所以它可以简单地直接取值。

于 2012-10-13T22:06:02.687 回答