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

标签 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*/
}

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

最佳答案

在 [MCVE] 之前,我会在黑暗中尝试一下(但请提供一个)。

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

void* RispostaServer();

那么 pthread_create 调用可见的唯一版本的 RispostaServer 是不接受参数的版本。这与编译器踢出的类型投诉相匹配。

你后面的函数 定义 创建了一个 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。

关于C++ PTHREADS - 无效的转换 void*(*)() 到 void*(*)(void*),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52890335/

相关文章:

时间:2019-03-08 标签:c++Template[]overload

C++ 是否使用放置新的未定义行为两次构造对象?

c++ - 在另一个模板中访问模板参数

c++ - 我应该如何在 C++ 中打印 pthread ID?

sql - 如何将雪花中的日期格式转换为祖鲁格式?

c - 信号量术语

matlab - 在 MATLAB 中转换为单个

SQL Round 强制转换为 float

c - 无法重新获取互斥量并在线程之间正确传递值

c - 多线程标准输出在每次执行时写入不同的内容