我正在尝试使用以下内容:
pthread_create(&searchThread[i], &threadAttribs[i], DoStuff, &ParallelParams[i]);
如果 DoStuff 是静态的,它会编译,但我无法访问属于 DoStuff 所在类的任何方法或变量。但是如果我将 DoStuff 保留为非静态方法,以便我可以访问类中的所有其他内容我都收到以下编译器错误:
错误:“void* (MyClass::)(void*)”类型的参数与“void* ()(void)”不匹配
错误似乎是指 DoStuff 参数以及它是一个成员函数的事实。
是否有希望能够传入一个非静态方法,允许我在我的 DoStuff 方法中访问 MyClass 中的所有内容?
谢谢!
最佳答案
pthreads 需要一个 void* startfunc(void*)
签名,并且非静态成员函数具有隐藏的 this
指针,因此您必须绕过它。一种简单的方法是在类中创建一个静态辅助函数。将其用作启动函数并在第四个(数据)参数中传递要访问的对象。像这样:
class Foo
{
public:
void *runThis(void)
{
std::cout << "Thread accessing this member function" << std::endl;
return 0;
}
static void *runHelper(void *classRef)
{
return ((Foo *)classRef)->runThis();
}
};
int main(int argc, char *argv[])
{
Foo foo;
pthread_t t;
pthread_create(&t, NULL, &Foo::runHelper, &foo);
pthread_join(t, NULL);
}
有一些更奇特的模板方法,类似于上面的方法,但更通用。
关于c++ - 在 pthreads (Linux) 中使用成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11194636/