为什么函数接受void指针?

时间:2015-09-09 19:20:05

标签: c++ c pthreads parameter-passing void-pointers

我想了解pthread。

但是,需要按如下方式创建线程方法:

void *SomeMethod(void* x)
{
    //Do Something
}

为什么有必要创建一个接受void指针的函数?我们不能将pthread与这样的函数一起使用吗?

void SomeMethod()
{
}

5 个答案:

答案 0 :(得分:5)

因为pthread_create函数接受void* (*)(void*)类型的参数,该参数是一个带void*并返回void*的函数,所以要使用{{1创建一个线程那就是你需要使用的东西。

pthread_create API用于将数据传递给新线程并再次获取数据。如果你不想传递任何内容,你仍然必须满足该接口,但只需将其传递为NULL。

仅仅因为现在不希望将任何参数传递给新线程并不意味着API应该被设计为仅支持您当前的用例。使用pthread_create(可以选择传递NULL)的函数编写API比使函数不带参数并要求用户出现的API要好得多用他们自己的解决方案将数据传递给新线程。

在C ++中,您可以为新线程使用任何类型的函数,并将其传递给您需要的任何参数:

void*

答案 1 :(得分:3)

因为他们只想编写一个用于创建线程的函数 - 获取和返回数据。

否则他们必须写出至少四种可能性。

您可以自由忽略输入参数和返回值。

只是一个简单的问题

答案 2 :(得分:3)

根据pthread_create()的{​​{3}},我们可以看到,该功能的签名是

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

其中第三个参数的类型为

void *(*start_routine) (void *)

这意味着,它需要一个指向函数的指针,该函数具有返回类型void *并接受void *参数。所以,我们需要相应地定义线程函数。

那就是说void指针用于参数传递,引用C11,章节§6.3.2.3

  

指向void的指针可以转换为指向任何对象类型的指针。指向任何对象类型的指针可以转换为指向void并再次返回的指针;结果应该等于原始指针。

正如我们所看到的,void指针用于将任何类型的数据传递给线程函数,只要它被转换回函数内的实际类型。 / p>

另外,FWIW,不要试图偏离函数指针所需的签名,因为标准明确要求

  

[....]如果转换的指针用于调用类型与引用类型不兼容的函数,则行为未定义。如果您不希望(需要)传递任何有效的参数值,您始终可以传递NULL

答案 3 :(得分:3)

因为很多时候,我们想要给线程一些工作(或者使用,或者关闭,或者其他)。一个非常典型的例子是传入一个类的实例,因此你可以调用类成员函数。

但它可能是各种其他的东西 - 结构或指向某些简单数据的指针。

当然,使用std::thread无论如何都会隐藏大部分此类内容,您无需担心。我强烈建议您使用std::thread代替pthread

答案 4 :(得分:2)

void *SomeMethod(void* x)用作新线程的入口点。 如果要将一些数据(结构,缓冲区,常规整数等)传递给新线程,您应该怎么做?特别为此入口点方法接收void*参数,该参数可以指向您想要的任何内容。然后在函数体内部,您可以将其强制转换为正确的类型,并由工作线程使用它。

如果您的主题不需要任何其他数据,您可以将NULLnullptr(对于C ++ 11)传递给它。