我做了所有必要的配置,比如包括Pthread库和头文件......
错误是:
error C3867: 'FunctionClass::calledfunction': function call missing argument list; use '&FunctionClass::calledfunction' to create a pointer to member
以下是导致错误的示例:
class FunctionClass
{
public:
void * calledfunction( void *);
/*
this is the definition of the function in the FunctionClass.cpp
void * FunctionClass::calledfunction( void *)
{
//do sth;
}
*/
};
int main(void)
{
pthread_t process_m;
FunctionClass *obj = new FunctionClass ();
int nbr= 5;
if(pthread_create(&process_m,NULL,obj->calledfunction,(void *)nbr)< 0)
{
std::cout << "thread1";
}
}
什么可能导致错误?我尊重函数pthread_create的语法......但是我找不到这个错误的原因!
答案 0 :(得分:5)
您不能将非静态成员函数用作回调。
使用自由函数或静态成员函数作为pthread_create
的第三个参数。
修改以反映OP的评论:
如果需要为特定FunctionClass
对象(在您的示例中为FunctionClass
)调用obj
的函数成员,通常的方法是调用静态成员函数(或者释放一个)将对象传递给它,然后从那里调用对象的成员函数。
这是一个例子(没有测试它,但它应该让你知道该怎么做):
struct obj_arg_pair { FunctionClass *obj; int nbr; };
static void * calledfunctionStatic( void *args_ )
{
obj_arg_pair *args = reinterpret_cast< obj_arg_pair * >( args_ );
return args->obj->calledFunction( args->nbr );
}
然后使用与此类似的代码启动您的线程:
obj_arg_pair args;
args.nbr = 5;
args.obj = obj;
pthread_create(&process_m,NULL,FunctionClass::calledfunction,(void *)&args);
答案 1 :(得分:2)
calledfunction必须是静态或非类函数。
编辑: 如果需要调用非静态功能,请执行以下操作。
struct forFunctionCalling
{
FunctionClass * ptr;
void * otherarguments;
};
void * somefunction (void * v)
{
forFunctionCalling * f_ptr = reinterpret_cast<forFunctionCalling>(v);
return f_ptr->ptr->calledfunction(f_ptr->otherarguments);
}
并调用somefunction而不是函数。 附:当然,如果你将类型otherarguments从void *更改为真实类型,这段代码看起来会更好
答案 2 :(得分:1)
你需要像其他人建议的那样去做:创建一个“对象”来保存你的函数需要的所有数据,然后将其打包到“void *”参数中。该函数应该是一个自由函数或静态类成员函数 - 静态成员函数,如果它需要访问该类的私有成员。
我将添加的是您必须如何处理打包到“void *”持有者中的对象的生命周期。你可以:
使用“new”创建它。你会知道它存在但必须在某个时候删除它。你不能将shared_ptr传递给你的线程函数,但如果你知道它是用“new”为你创建的,你可以将shared_ptr放在你的线程函数中。您还可以将删除器作为压缩结构的成员之一,并在boost :: shared_ptr中使用它,以便在调用时指示如何清理数据。
使用等待机制,以便调用者在退出对象丢失范围之前等待线程“接受”数据。在复制此数据供其使用后,该线程“接受”。这样,您就可以创建数据的本地结构并将其传递。
您可以考虑使用boost :: thread,尽管您可以将shared_ptr对象作为参数传递给boost :: bind并以接收这些函数的方式编写函数。