将类型转换指针传递给 pthread_join

passing a type casted pointer to pthread_join

我有一个任务,我在 C 中使用线程,并且与很多人一样,我遇到了由于 pthread_join 的第二个参数是 void** 类型导致的错误,然后在一些研究我弄清楚了类型转换是如何工作的。这是我正在谈论的示例:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>

void *callback(void *arg){
    sleep(2);
    pthread_exit("done !!\n");
}

int main(){
  pthread_t th;
  void *val;

  pthread_create(&th, NULL, callback, NULL);
  pthread_join(th, &val);
  printf("%s", (char*)val);

  return EXIT_SUCCESS;
}

这按预期工作,但后来我很好奇并尝试声明一个 char *val 然后将其转换版本传递给 pthread_join 函数,如下所示:

int main(){
  pthread_t th;
  char *val;

  pthread_create(&th, NULL, callback, NULL);
  pthread_join(th, (void*)&val);
  printf("%s", val);

  return EXIT_SUCCESS;
}

这工作正常,但我不明白类型转换在此版本的代码中是如何工作的。谁能解释一下吗?

第一个密码正确,第二个密码错误。你会摆脱它,因为 char *void * 的表示很可能是兼容的。

在 C 中强制转换的显式指针几乎总是说:"I am going to do some really dirty tricks, trust me, I know better than you, dear compiler, what I am doing"。只有 4 个例外情况是必须且正确的:

  • 转换为字符指针或character/void指针返回原始
  • 将指向结构的指针转换为指向初始成员类型的指针,反之亦然
  • 将指针转换为以原始类型作为其成员的联合
  • 将指向函数的指针转换为另一种函数指针类型

其他情况都是求鼻魔。强制转换的经验法则是:"the less the better".

此外,pthread_join 期望的类型是 void **,而不是您的演员表生成的 void *,但是作为通用指针的 void * 会被静默转换pthread_join.

预期的 void **