我有一个名为 qwerty 的类和一个名为 compute_ans 的函数,它接受一个void指针并返回一个void指针。现在,当我尝试编译时,以下语句抛出错误
pthread_create (thread_a, NULL, compute_ans, (void*) struct_left);
函数的定义是 void * compute_ans(void * struct_input)
错误是
无法将'qwerty :: compute_ans'从类型'void *(qwerty ::)(void *)'转换为'void *()(void )'*
答案 0 :(得分:3)
您不能将指向非静态成员函数的指针转换为指向函数的指针,C ++不允许它。原因是成员函数将隐式this
指针作为参数。从本质上讲,这会将函数的签名更改为void* compute_ans(qwerty*, void*)
。为了将函数传递给pthread_create
,您需要使成员函数保持静态。
class qwerty
{
public:
// ... other member functions and variables ...
// thread start function
static void* compute_ans(void*);
};
如果你不能使它成为静态成员函数,你需要将指向qwerty
对象的指针传递给线程启动函数。查看问题中的代码,还需要将其他数据传递给线程函数。为此,您可以使用包含所有必要数据的附加数据结构,并将指针传递给它。
class qwerty; // forward declaration
// Structure passed to pthread_create and our helper function
struct thread_data
{
qwerty* qptr; // pointer to qwerty object
void* data; // pointer to other data. change void to your data type.
};
class qwerty
{
public:
// thread start function
static void* start_compute_ans(void* param)
{
// get a pointer to the thread data
thread_data* tdata = static_cast<thread_data*>(param);
// Call the real compute_ans
tdata->qptr->compute_ans(tdata->data);
// Delete the data (use an appropriate smart pointer if possible)
delete tdata;
return NULL;
}
// the real
void compute_ans(void*)
{
// do stuff here
}
};
// Create our thread startup data
thread_data* tdata = new thread_data();
tdata->qptr = qwerty_pointer;
tdata->data = struct_left;
// start the thread data
pthread_create (thread_a, NULL, &qwerty::start_compute_ans, tdata);
答案 1 :(得分:0)
您可以找到答案here。
您应该使用静态函数传递给pthread。
class qwerty
{
public:
void compute_ans(void)
{
std::cout << "Compute result!" << std::endl;
return
}
static void hello_helper(void *context)
{
return ((qwerty *)context)->compute_answer();
}
};
...
qwerty c;
pthread_t t;
pthread_create(&t, NULL, &qwerty::hello_helper, &c);