我在头文件中的Class定义中声明了一个函数:
class A
{
public:
...
void* func(void *);
...
}
在.C文件中,我指向A类对象的指针为 ptr。
现在,当我创建一个pthread:
iret1 = pthread_create(&thread1, NULL, ptr->func, NULL);
它会抛出一个错误: 错误:指向绑定函数的指针只能用于调用函数。
但是当我将函数 func 声明为静态时,此错误不会发生。
我只是想知道一个解决方法,因为我无法将函数更改为静态,因为我无法从中调用其他非静态成员。
答案 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
并将隐藏的第一个参数传递给函数。