在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 *)
的函数。
为什么?
谢谢!
答案 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 *,大概是为了表明它只是一些没有类型的值。