2012-06-25 21 views
1

我试图使用以下内容:使用成员函数在pthread(Linux)的

在pthread_create(& searchThread [I],& threadAttribs [I],DoStuff,& ParallelParams [I]);

如果DoStuff是静态的,它会编译,但是我没有访问DoStuff所在的类的一部分的任何方法或变量。但是,如果我保持DoStuff作为非静态方法,以便我可以访问一切在课堂上,我得到以下编译器错误:

错误:类型“无效*(MyClass的::)(无效*)”的说法不符合“无效*()(无效)”

其中错误似乎指的是DoStuff参数以及它是成员函数的事实。

是否有任何希望能够通过非静态方法允许我在我的DoStuff方法中访问MyClass中的所有内容?

谢谢!

回答

5

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); 
} 

有一些fancier模板方法相当于上面的东西,但是更通用。

+0

从技术上讲,这是无效的,因为传递给'pthread_create'的函数指针必须是'extern“C”',而静态成员函数不是......但它适用于GCC(和其他编译器)一个[bug /特性](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=2316)无法区分'extern“C”'和'extern“C++”'函数。 –

+0

@JonathanWakely我认为在GCC和其他编译器的情况下,它会在编译时将pthread_create调用中的函数名称转换为函数指针。但是你列出的错误报告称这种观点存在问题。你知道一些编译器中的函数指针是在编译时转换还是在运行时处理? –

+0

@ZacharyKraus,我不确定你的意思。函数指针是在编译时处理的,但我不明白在这里或链接的错误报告中是如何相关的。 C++标准说,extern C函数与extern C++函数是不同的类型,这是编译时的类型系统的静态属性。我不知道你在想什么运行时间处理。 –