带参数的类的Pthread成员函数

pthread member function of a class with arguments

本文关键字:成员 函数 Pthread 参数      更新时间:2023-10-16

我成功地使用本页底部的代码将线程附加到类成员:http://www.tuxtips.org/?p=5.

我不知道如何扩展代码来封装一个方法,如void* atom(void *inst),其中*inst是一个包含各种线程参数的结构。具体来说,Netbeans和我都不了解example::*f的定义以及它如何在thread_maker范围内有效。

我认为使用诸如pthread(它接受c回调)之类的东西的更好解决方案是创建一个包装函数,以便您可以更容易地使用boost::函数来代替。这类似于在C代码中使用boost::bind(),它会工作吗?

那么您可以简单地使用boost::bind

来解决问题。
class myClass
{
    void atom(myStruct *data); // void return type to keep it similar to other code
    // You could change it to a void* return type, but then you would need to change the boost::function declarations
};
boost::function<void(void)> function = boost::bind(&myClass::atom,&myClassInstance,&myStructInstance); //bind your function
boost::function<void(void)>* functionCopy = new boost::function<void(void)> (function); //create a copy on the heap
pthread_t id;
pthread_create(&id,NULL,&functionWrapper,functionCopy);

包装器函数应该是这样的:

void functionWrapper(void* data)
{
   boost::function<void(void)> *func = (boost::function<void(void)>* ) (data);
   (*func)();
   delete(func);
}

虽然这个方法可能比手动传递数据要麻烦,但它更具可扩展性,可以很容易地绑定任何东西并传递它来启动线程。

编辑

最后一点:myClassInstance和myStructInstance应该在堆上。如果它们在堆栈上,它们可以在线程启动之前被删除。