1

查看手册页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

谢谢。

4

2 回答 2

4

继续上面的评论...

(1)pthread_create启动函数(第三个参数)必须有一个签名

void *(*start_routine) (void *)

也就是说,一个函数接受一个 void 指针并返回一个 void 指针。例如:

void* myfunc(void *)

您收到编译错误,因为您的 start 函数可能(并且错误地)如下所示:

void myfunc(void)

换句话说,一个带参数也不返回结果的函数。您通过将 myfunc 转换为指向 void 的指针来解决此编译器错误,但这是不必要且错误的。您真正的问题是您的启动函数“myfunc”的签名错误。

(2) 看来您对 void 和指向 void 的指针很感兴趣。这里有几个很好的答案,包括这个。基本上,指向 void 的指针是可以指向任何类型的通用指针。

pthread_create本身就是使用 void ptrs 的一个很好的例子。因为 start 函数无法知道开发人员想要从函数中传递(和返回)什么样的数据,所以他们使用可以指向任何类型的 void ptr。然后由 start 函数的开发人员将 void ptr 转换为他实际传递的适当类型,然后再使用 void ptr 指向的任何内容。所以现在 start 函数可以处理一个实际上可能指向 int、double、数组、结构或其他任何东西的 ptr。

在您的情况下,您正在将指向具有特定签名的函数的指针转换为指向任何内容的指针。这可能会让编译器满意,因为它假设您知道自己在做什么。但是在这种情况下,您不会这样做,因为您正在掩盖真正的错误,即您的 start 函数的签名是错误的。

于 2013-07-10T14:57:06.357 回答
1

函数和数组地址将在有或没有 & 的情况下获得。
但其他变量不会,您仍应使用 (void*)&variable。

仅供参考
函数指针和函数地址

于 2013-07-10T02:33:41.487 回答