use*_*067 1 c++ linux pthreads
我正在尝试使用以下内容:
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指针,因此您必须绕过它.一种简单的方法是在类中创建一个静态辅助函数.将其用作启动函数,并在第4个(数据)参数中传递要访问的对象.像这样的东西:
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);
}
Run Code Online (Sandbox Code Playgroud)
有一些更高级的模板方法相当于上面的东西,但更通用.