使用 void 函数创建 POSIX 线程?

标签 c pthreads posix

我试着用这样的 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/

相关文章:

c - C 中 strcmp() 的问题

linux - 显示线程优先级

c++ - c/c++ 中的线程程序是否应该比串行程序运行得更快?

c - 这个表达式 : void* (*fct)(void*(*)(void*), void*) 是什么意思?

regex - 为什么在使用正先行 (?=...) 时我对 regexp_matches 函数的响应为空

C - 如何通过引用将字符串数组传递给另一个函数?

c - 外部结构数组

c++ - MPIR gcc 编译 - 找不到 -lmpir

c - 结构中的 "s"是什么意思?

c - 你如何用 C 找到正则表达式中的所有匹配项?