我正在将类成员函数传递给pthread_create并低于错误。我知道stackoverflow上已经有很多查询,他们说的是在pthread_create中的pthread和函数回调中围绕类成员函数做一个静态助手,并通过pthread_create中的最后一个参数传递该静态函数,但是在我的情况下,成员函数具有参数还。因此,我的问题略有不同。我应该在哪里通过成员函数参数?
#include <stdio.h>
#include <pthread.h>
struct Point
{
int y;
int z;
};
class A
{
int x;
public:
int getX();
void setX(int val) {x = val;}
void* func(void* args)
{
Point p = *(Point *)args;
int y = p.y;
int z = p.z;
return (void *)(x + y + z);
}
void myFunc()
{
int y = 12;
int z = 2;
pthread_t tid;
Point p;
p.y = y;
p.z = z;
pthread_create(&tid, NULL, func, &p);
pthread_join(tid, NULL);
}
};
int main(int argc, char *argv[])
{
A a;
a.myFunc();
return 0;
}
错误:
classThreads.c: In member function ‘void A::myFunc()’:
classThreads.c:40:42: error: cannot convert ‘A::func’ from type ‘void* (A::)(void*)’ to type ‘void* (*)(void*)’
pthread_create(&tid, NULL, func, &p);
问题是您没有将this
指针传递给线程创建方法。这需要添加到参数列表中。
#include <utility>
#include <pthread.h>
struct Point
{
int y;
int z;
};
class A
{
int x;
public:
int getX();
void setX(int val) {x = val;}
static void* func(void* args)
{
std::pair< A*, Point > tp = *(std::pair< A*, Point > *)args;
int y = tp.second.y;
int z = tp.second.z;
return (void *)(tp.first->x + y + z);
}
void myFunc()
{
int y = 12;
int z = 2;
pthread_t tid;
Point p;
p.y = y;
p.z = z;
std::pair< A*, Point > tp( this, p );
pthread_create(&tid, NULL, func, &tp);
pthread_join(tid, NULL);
}
};
int main(int argc, char *argv[])
{
A a;
a.myFunc();
return 0;
}
您可以使用std::tuple
类通过this
指针和多个参数。