从pthread_create()调用函数时出错

时间:2014-03-12 18:51:47

标签: c++ oop pthreads

我在头文件中的Class定义中声明了一个函数:

class A
{
   public:
   ...
   void* func(void *);
   ...
}

在.C文件中,我指向A类对象的指针为 ptr。

现在,当我创建一个pthread:

iret1 = pthread_create(&thread1, NULL, ptr->func, NULL);

它会抛出一个错误: 错误:指向绑定函数的指针只能用于调用函数。

但是当我将函数 func 声明为静态时,此错误不会发生。

我只是想知道一个解决方法,因为我无法将函数更改为静态,因为我无法从中调用其他非静态成员。

1 个答案:

答案 0 :(得分:1)

您不能将非静态成员函数用作线程函数,也不能将任何非C ++函数用作期望函数指针的函数。原因是所有非静态成员函数都有一个隐藏的第一个参数,它成为this指针。

在这种情况下,可以使用静态代理函数解决:

class A
{
public:
    void* func();

    static void* wrapper(void* object)
        { return reinterpret_cast<A*>(object)->func(); }
};

...

A* ptr = new A;
iret1 = pthread_create(&thread1, NULL, &A::wrapper, ptr);

这将创建以A::wrapper作为线程函数的线程,并将实例指针作为参数传递。然后A::wrapper函数将此参数用作指向实例的指针,并调用实际函数。


但是,如果你有一个支持C ++ 11的编译器和标准库,那么对threads有更好的支持:

A myA;
std::thread myThread(&A::func, &myA);

上面的对象创建创建了一个线程,它将调用A::func并将隐藏的第一个参数传递给函数。