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

calling a non static function with multiple arguments using threads in c++

本文关键字:参数 静态函数 c++ 调用 线程      更新时间:2023-10-16
'pthread_create (thread, attr, start_routine, arg)'

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

我在我的类中使用线程,它有许多执行繁重任务的函数,所以我想在自己的线程上执行每个函数,但我不能这样做,因为Pthrad_create只需要一个参数,也是静态类型的函数,所以我怎么能解决这个问题。

谢谢。

关于pthread的其他回答:

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

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

可移植,更容易维护。

编辑:

如您所问,您可以在这里找到std::thread文档。

这篇文章也讨论了传递多个参数:

#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);
}

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

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);
}

可以。例如,您可以将指针传输到包含多个参数的结构体。

参见:pthread_create()调用的函数有多个参数?(和第一个答案)。

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

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;
}