为什么函数返回类型需要为C中的线程类型(void *)?

时间:2012-05-04 23:27:47

标签: c multithreading pthreads

在c中,我们创建一个类似的线程:

void * run(void * arg){
    printf("hello world\n");
}

int main(){
    pthread_t thread;
    int a = pthread_create(&thread, NULL, run, (void*)0);
}

但如果我宣布运行为

,它将无效
void run(){}

另一方面,如果我在(void *)的参数中将其强制转换为pthread_create,则可以正常工作。因此它只接受返回类型为(void *)的函数。

为什么?

谢谢!

3 个答案:

答案 0 :(得分:4)

在我的系统上,man pthread_create说:

  

如果start_routine返回,则效果就像是对pthread_exit()的隐式调用,使用start_routine的返回值作为退出状态。

此返回值可通过pthread_join()函数获取:

  

从具有非NULL pthread_join()参数的成功value_ptr调用返回时,终止线程传递给pthread_exit()的值存储在{{1}引用的位置中}。

答案 1 :(得分:4)

必须声明线程函数返回void *,因为线程库需要这样的返回值,并在线程终止后将其存储到pthread_join()给定的位置。

如果您不需要任何线程返回值,则只需return 0;

答案 2 :(得分:0)

为什么不呢?根据定义,无法调用或返回线程,因为它们具有自己的堆栈。然而,通常有用的是能够向线程发送一些初始数据,并且有可能在线程终止时发出一些信号可能也是有用的。操作系统设计人员知道这一点,因此允许在启动时将固定数量的数据复制到线程堆栈中,并在终止时发出信号。 OS线程调用必须与语言无关,因此通用选择一个机器宽度的单词。 C将此表示为void *,大概是为了表明它只是一些没有类型的值。