如何修复此Pthread示例中的错误?

时间:2011-01-20 13:20:03

标签: c++ pthreads

我做了所有必要的配置,比如包括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的语法......但是我找不到这个错误的原因!

3 个答案:

答案 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并以接收这些函数的方式编写函数。