您好我有以下功能:
void task2(int a)
{
printf(" Task 2 running..\n");
sleep(2);
printf(" Task 2 exiting..\n");
}
thpool_add_work(threadpool, (void*)task2, (void*)a);
int thpool_add_work(thpool_t* tp_p, void *(*function_p)(void*), void* arg_p)
{
// some code here
}
上面的代码适用于C,但不能用C ++编译。我收到以下错误:
error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’
error: initializing argument 2 of ‘int thpool_add_work(thpool_t*, void* (*)(void*), void*)’
我无法找出导致此错误的原因。当我将文件扩展名更改为CPP并编译时,不知道为什么会出现这个错误?
答案 0 :(得分:2)
您必须更改task2
的签名以匹配thpool_add_work
参数的类型:
void* task2(void* a)
创建线程的调用将变为
thpool_add_work(threadpool, task2, &a);
假设a
为int
。
如果您需要使用task2
的参数,您可以执行以下操作:
int ia = *(int*)a;
更新以回答OP评论
thpool_add_work
期望带有void*
参数的函数是有原因的。以这种方式,您可以将任何类型的参数传递给线程函数,尽管是以类型不安全的方式。
您将转换为void*
的参数的地址作为thpool_add_work
的第三个参数传递。然后,将指向void
的指针转回指向预期参数类型的指针,并取消引用它以获取参数的值。我给出了上面int a
的示例,现在它将如何寻找浮点数:
void* test3(void* a)
{
float fa = *(float*)a;
.....
return NULL;
}
答案 1 :(得分:0)
试试这个
thpool_add_work(threadpool, (void* (*)(void*))task2, (void*)a);
C会自动将void*
转换为任何类型,而C ++则不会。
您可以使用typedef
改进代码typedef void* (*worker_func_t)(void*);
thpool_add_work(threadpool, (worker_func_t)task2, (void*)a);
int thpool_add_work(thpool_t* tp_p, worker_func_t function_p, void* arg_p)
{
// some code here
}