4

在 c 中,我们像这样创建一个线程:

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

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

但是如果我声明 run as 它将不起作用

void run(){}

另一方面,如果我将它转换(void *)为 的参数pthread_create,它工作正常。所以它只接受返回类型为(void *).

为什么?

谢谢 !

4

3 回答 3

5

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

如果你不需要任何线程返回值,你可以只return 0;.

于 2012-05-04T23:31:34.693 回答
4

在我的系统上,man pthread_create说:

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

该返回值可通过pthread_join()函数获得:

pthread_join()使用非 NULLvalue_ptr参数的成功调用返回时,终止线程传递给的值pthread_exit()存储在value_ptr.

于 2012-05-04T23:30:40.733 回答
0

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

于 2012-05-05T10:47:00.997 回答