使用c ++中的线程调用具有多个参数的非静态函数

时间:2014-06-04 05:11:30

标签: c++ multithreading c++11 pthreads

'pthread_create (thread, attr, start_routine, arg)'

我可以调用非静态函数创建具有多个参数的线程,因为pthread_create()只接受一个参数且属于void类型。

我在我的类中使用线程,它有许多执行繁重任务的函数,所以我想在自己的线程上执行每个函数但我不能这样做,因为Pthrad_create只接受一个参数而且函数类型静态,所以我该如何解决这个问题。

感谢。

5 个答案:

答案 0 :(得分:3)

要完成有关pthread的其他答案:

由于您标记了C ++ 11,请完全避免使用pthread,并使用std::thread

std::thread t(func1,a,b,c,d);

它便携,易于维护。

修改

如您所知,您可以找到std::thread文档here

SO post discussed也传递了多个参数:

#include <thread>

void func1(int a, int b, ObjA c, ObjB d){
    //...
}

int main(int argc, char* argv[])
{
    std::thread t(func1,a,b,c,d);
}

答案 1 :(得分:2)

是的,你可以。例如,您可以将指针传递给包含许多参数的struct。

请参阅:Multiple arguments to function called by pthread_create()?(和第一个答案)。

答案 2 :(得分:2)

您可以将所有这些参数放入结构中,并将指向该结构的指针传递给存根函数。然后,存根函数调用实际函数。

struct foo
{
    int param1;
    int param2;
    // etc.
};

struct foo myFoo;
myFoo.param1 = 1;
myFoo.param2 = 42;

pthread_create(thread, attr, stub_function, &myFoo);


void stub_function(void* params)
{
    foo myFoo = (foo*)params;
    real_function(myFoo->param1, myFoo->param2);
}

答案 3 :(得分:2)

使用结构传递多个参数。在这里,您可以传递任何数据,包括类对象指针。在静态线程proc中,您可以进行类型转换以再次获取Class对象指针,在这里您可以根据需要自由使用类对象指针。

答案 4 :(得分:1)

class Student
{
public:
    Student() { m_Age = 25; }
    int m_Age;
};

typedef struct
{
    Student *pStudent;
    // You can add other data members also.
} DATA;

static void fnStatic(void *pData)
{
    DATA *data = (DATA*)pData;
    cout << data->pStudent->m_Age << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    Student *pStudentPtr = new Student();

    DATA *data = new DATA();
    data->pStudent = pStudentPtr;

    fnStatic(data);
    return 0;
}