首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ PTHREADS -无效转换为空*(*)()到空*(*)(空*)

C++ PTHREADS -无效转换为空*(*)()到空*(*)(空*)
EN

Stack Overflow用户
提问于 2018-10-19 18:14:35
回答 1查看 46关注 0票数 0

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

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

代码语言:javascript
运行
复制
{/*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*/
}

我应该编辑什么?我试了几个小时。

EN

回答 1

Stack Overflow用户

发布于 2018-10-19 18:22:28

我会在黑暗中试一试,pre-MCVE

你对RispostaServer的声明是这样的吗?

代码语言:javascript
运行
复制
void* RispostaServer();

那么pthread_create调用唯一可见的RispostaServer版本就是不带参数的版本。这与编译器排除的类型投诉相匹配。

后面的函数定义创建了一个新的带有参数的RispostaServer重载,您可以在代码下面调用该重载,但对于pthread_create调用来说已经太晚了。

声明应与定义匹配:

代码语言:javascript
运行
复制
// Entrypoint for Risposta worker thread.
// Argument must be a risposta*, cast to `void*`.
void* RispostaServer(void* m);

顺便说一句,您的线程将会中断,因为您传入了一个指向本地变量的指针,该变量立即超出了作用域,因此请在上面添加以下注释:

代码语言:javascript
运行
复制
// The risposta it points to must exist for the lifetime
// of the thread.

…而且,您真的应该使用std::thread,而不是特定于平台的库的C。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52890335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档