Pthreads,与pthread_join混淆(pthread_t,void **)

时间:2012-10-13 10:56:27

标签: c++ c pthreads pthread-join

我无法理解为什么pthread_join作为返回值的第二个参数void**,而给定返回值的pthread_exit的返回值参数为{ {1}}。

2 个答案:

答案 0 :(得分:4)

pthread_join等待线程结束,并将pthread_exit的结果值存储到* value_ptr中。如果要忽略结果,可以为value_ptr传递NULL。这是通过将指针传递给变量来模拟传递引用的常见C实践。见Passing by reference in 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
} 

答案 1 :(得分:2)

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

  • 成功/失败指示
  • 返回的任何线程(类型为void*

在C中,函数“返回”两个单独值的典型方法是让函数正常返回其中一个值,并在调用者传入指针的调用者提供的位置“返回”其他值。到那个地方。所以pthread_join()

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

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

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