C ++ PTHREADS-无效的将void *(*)()转换为void *(*)(void *)

时间:2018-10-19 10:14:35

标签: c++ casting pthreads

我必须将类型“ risposta”的参数“ r”发送到函数RispostaServer。编译器给我:invalid conversion void*(*)() to void*(*)(void*)

这是我应该纠正的代码片段:

{/*other istructions*/
risposta r;
r.mess = m1;
r.codaSC = codaSC;
pthread_create(&threads[threads_index],&attr,RispostaServer,(void*)&r);
threads_index++;
}

void* RispostaServer(void* m){
risposta* m1 = (risposta*) m;
/*other istructions*/
}

我应该编辑什么?我正在尝试几个小时。

1 个答案:

答案 0 :(得分:2)

在[MCVE]之前,我会为此在黑暗中刺伤(但请提供一个)。

您对RispostaServer的声明看起来像这样吗?

void* RispostaServer();

然后,RispostaServer调用可见的pthread_create的唯一版本是不带参数的版本。符合编译器发出的类型投诉。

您以后的函数 definition 创建RispostaServer的新重载,确实接受一个参数,然后您可以在代码下面调用它,但此时pthread_create调用为时已晚。

声明应符合定义:

// Entrypoint for Risposta worker thread.
// Argument must be a risposta*, cast to `void*`.
void* RispostaServer(void* m);

顺便说一句,线程将被破坏,因为您要传递指向立即超出范围的局部变量的指针,因此在上面添加以下注释:

// The risposta it points to must exist for the lifetime
// of the thread.

...并且您真的应该使用std::thread而不是平台特定库的C API。