首页 > 解决方案 > 将类型转换的指针传递给 pthread_join

问题描述

我有一个任务,我在 C 中使用线程,并且与很多人类似,我得到了由pthread_join' 的第二个参数是 type引起的错误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;
}

这工作得很好,但我不明白类型转换在这个版本的代码中是如何工作的。谁能解释一下?

标签: ccastingpthreads

解决方案


第一个代码是正确的,第二个代码是错误的。你会侥幸逃脱,因为 和 的表示char *void *可能是兼容的。

用 C 语言转换的显式指针几乎总是说:“我要做一些非常肮脏的把戏,相信我,亲爱的编译器,我比你更了解我在做什么”。只有 4 个例外情况是必须且正确的:

  • 将字符指针或字符/空指针转换回原始指针
  • 将指向结构的指针转换为指向初始成员类型的指针,反之亦然
  • 将指针强制转换为具有原始类型作为其成员的联合
  • 将指向函数的指针转换为另一个函数指针类型

所有其他情况都要求鼻恶魔。演员表的经验法则是:“越少越好”。

此外,预期的类型pthread_joinisvoid **而不是void *你的演员产生的类型,但是void *作为一个泛型指针被默默地转换为void **预期的pthread_join.


推荐阅读