C语言 pthread_join void **retval



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

void* threadHandler(void* arg)
{
  printf("arg: %cn", *(char *) arg);
  pthread_exit(0);
}
int main()
{
  pthread_t threadA;
  pthread_create(&threadA, NULL, threadHandler, "N");
  void *retval;
  pthread_join(threadA, &retval);
  printf("retval: %dn", *(int *) retval);
  return 0;
}

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

提前感谢!

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

#include <stdio.h>
#include <stdint.h>
#include <pthread.h>
void *
threadHandler(void *data)
{
    printf("arg: %sn", (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("%dn", ((int) (intptr_t) number));
    return 0;
}

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

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

相关内容

  • 没有找到相关文章

最新更新