【发布时间】:2016-04-10 08:32:25
【问题描述】:
是否可以直接将 void 指针类型转换为 long 而不会造成麻烦?下面是我从代码here中提取的一小段代码sn-p(页面Pthread Joining部分下的示例)。
{
void *status;
long t;
rc = pthread_create(&thread[t], &attr, BusyWork, (void *)t);
rc = pthread_join(thread[t], &status);
printf("Main: completed join with thread %ld having a status of %ld\n",t,(long)status);
}
正如this manual page 所说,pthread_join() 将目标线程的退出状态(即目标线程提供给 pthread_exit() 的值)复制到 *retval(在这种情况下为 *status) 指向的位置.但是在我提到的程序中,状态并不指向任何位置。那么程序如何仍然有效?
其次,据我所知,状态不能保持长值那么类型转换状态如何给我们一个长而不是地址的值?
【问题讨论】:
-
@MartinR :正如this 所说,pthread_join() 将目标线程的退出状态(即目标线程提供给 pthread_exit(3) 的值)复制到该位置由 *retval 指向。但是在我提到的程序中,status 没有指向任何位置,那么该程序是如何工作的?
-
这是偶然的。变量状态未初始化,因此它将写入状态指向的任何位置。碰巧,它可能在某个地方是合法的。如果它是非法的,你会遇到崩溃。
-
@cup :这是否意味着 turorial 不可靠?他们如何通过将指针类型转换为 long 而不是取消引用来获得正确的输出?
-
抱歉 - 我之前的评论不正确,因为您没有发布调用 pthread_exit 的代码。在本教程中,pthread_exit 将 long 转换为 void*。 pthread_join 获得 pthread_exit 的结果,因此它必须将其重铸回 long。本教程是可靠的,但它假定 void* 占用的空间至少与 long 相同或更多。
标签: c pthreads pthread-join