p中的pthread_create参数

时间:2013-07-10 02:16:07

标签: c pthreads

查看pthread_create(...)的手册页,我看到定义如下......

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);

我的第一个问题是在pthread_create传递参数3时;我是在转换函数名的地址还是只是函数名?对我而言似乎产生了相同的结果......那么它们之间的区别是什么?

(void *)&function_name
(void *)function_name

我的第二个问题是在传递参数4时在pthread_create中,我们是否应该总是给出args变量的地址,如

(void *) &variable

或者我们可以直接传递像

这样的值
(void *)variable

感谢。

2 个答案:

答案 0 :(得分:4)

继续上述评论......

(1)pthread_create启动功能(第3个参数)必须具有

的签名
void *(*start_routine) (void *)

即一个带有void指针并返回void指针的函数。例如:

void* myfunc(void *)

您收到编译错误,因为您的启动函数可能(并且不正确)看起来像这样:

void myfunc(void)

换句话说,一个函数采用 no 参数并且不返回任何结果。你通过将myfunc转换为指向void的指针来解决这个编译错误,但这是不必要的和错误的。你真正的问题是你的启动函数“myfunc”有错误的签名。

(2)看起来你已经陷入虚空,指向虚空。这里有几个很好的答案,包括this。基本上,指向void的指针是一个通用指针,可以指向任何类型。

pthread_create本身就是使用void ptrs的一个很好的例子。因为启动函数无法知道开发人员想要从函数传递(并返回)哪种数据,所以他们使用可以指向任何类型的void ptr。取决于启动函数的开发者,然后将void ptr转换为他实际传递的适当类型,然后再使用void ptr指向的内容。所以现在start函数可以处理一个ptr,它实际上可能指向int,double,数组,结构等等。

在您的情况下,您将指向具有特定签名的函数的指针转换为指向任何内容的指针。这可能会满足编译器,因为它假定您知道自己在做什么。但是在这种情况下你没有,因为你正在写真正的错误,即你的启动函数的签名是错误的。

答案 1 :(得分:1)

函数和数组地址将带或不带&。
但其他变量不会,你仍然应该使用(void *)&变量。

FYI
Function pointers and address of a function