我试着用这样的 void 函数创建 POSIX 线程:
void thread_func(void* p_Arg)
{
printf("Hello, World!\n");
}
int main(void)
{
pthread_t thread;
pthread_create(&thread, NULL, (void*)thread_func, (void*)NULL);
return 0;
}
代码运行良好!但是在这种情况下将 thread_func 转换为 void* 是否安全?
最佳答案
没有。您的代码 will crash on IA64 .函数指针转换为 a bug waiting to happen .只需使用正确的签名并返回一个虚拟值,如 0。
另请注意,将函数指针(如 void (*)(void*)
)强制转换为对象指针(如 void*
)也是一种潜在的不安全操作,因为 C 标准不保证对象指针和函数指针具有相同的表示形式。我不知道有任何架构使用不同的表示形式,但函数指针肯定有可能包含对象指针中通常不存在的额外上下文位。
所以你永远不应该将函数指针转换为对象指针,除非你使用的是明确允许的实现 -- 例如,POSIX systems require这,所以来自 dlsym(3)
的返回值可以安全地从对象指针转换为函数指针。
关于使用 void 函数创建 POSIX 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11992452/