在pthreads中使用成员函数(Linux)

时间:2012-06-25 17:54:57

标签: c++ linux pthreads

我正在尝试使用以下内容:

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

如果DoStuff是静态的,它会编译,但是我无法访问DoStuff所在的类中的任何方法或变量。但是如果我将DoStuff保持为非静态方法以便我可以访问类中的其他所有内容我得到以下编译器错误:

错误:类型'void *(MyClass ::)(void *)'的参数与'void *()(void )'

不匹配

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

是否有希望能够传递一个非静态方法,允许我在DoStuff方法中访问MyClass中的所有内容?

谢谢!

1 个答案:

答案 0 :(得分: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);
}

有一些更高级的模板方法可以达到类似上述的功能,但更通用。