我想了解pthread。
但是,需要按如下方式创建线程方法:
void *SomeMethod(void* x)
{
//Do Something
}
为什么有必要创建一个接受void
指针的函数?我们不能将pthread与这样的函数一起使用吗?
void SomeMethod()
{
}
答案 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*
参数,该参数可以指向您想要的任何内容。然后在函数体内部,您可以将其强制转换为正确的类型,并由工作线程使用它。
如果您的主题不需要任何其他数据,您可以将NULL
或nullptr
(对于C ++ 11)传递给它。