pthread_join void ** retval

时间:2016-05-20 11:36:27

标签: c segmentation-fault pthreads

我在尝试访问pthread_join的第4个参数时遇到了分段错误。这是我的代码:

void* threadHandler(void* arg)
{
  printf("arg: %c\n", *(char *) arg);
  pthread_exit(0);
}

int main()
{
  pthread_t threadA;
  pthread_create(&threadA, NULL, threadHandler, "N");

  void *retval;
  pthread_join(threadA, &retval);

  printf("retval: %d\n", *(int *) retval);

  return 0;
}

为什么最后一个printf会导致分段错误错误?我如何解决它? (我的理解是retval应该包含threadHandler的返回值,所以在这种情况下,它应该是0对吗?)

提前致谢!

1 个答案:

答案 0 :(得分:4)

如果您理解pthread_join()将选择线程回调的返回值,那么您应该像这样返回

#include <stdio.h>
#include <stdint.h>
#include <pthread.h>

void *
threadHandler(void *data)
{
    printf("arg: %s\n", (char *) data);
    return (void *) 0;
}

int 
main(void)
{
    pthread_t thread;
    const char *string;
    void *number;

    string = "N";
    if (pthread_create(&thread, NULL, threadHandler, (void *) string) != 0)
        return -1;
    pthread_join(thread, &number);
    printf("%d\n", ((int) (intptr_t) number));
    return 0;
}

但请注意,返回的地址0x00可能不是有效地址 - 通常它是NULL指针(void *) 0x00 - 所以你只要您有兴趣将指针的值用作要返回的整数,就应该这样做。

取消引用指针是未定义的行为但是,使用该值不是。