为啥 pthread_join 会出现此错误? [错误] 从 'void*' 到 'void**' 的无效转换 [-fpermissive]
Posted
技术标签:
【中文标题】为啥 pthread_join 会出现此错误? [错误] 从 \'void*\' 到 \'void**\' 的无效转换 [-fpermissive]【英文标题】:Why the pthread_join is giving this error? [Error] invalid conversion from 'void*' to 'void**' [-fpermissive]为什么 pthread_join 会出现此错误? [错误] 从 'void*' 到 'void**' 的无效转换 [-fpermissive] 【发布时间】:2019-03-15 22:24:57 【问题描述】:我一直在关注这个应用程序,我试图复制这个程序并看看它做了什么。
令我大吃一惊的是,我发现它不起作用!
程序如下:
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include <time.h>
#define TANTI 10
int parametroOUT;
void* codice(void *arg)
srand(time(NULL));
parametroOUT=(rand()%6)+1;
pthread_exit((void*)¶metroOUT);
int main()
int dadoEstratto, *risultato=0;
pthread_t t1;
pthread_create(&t1,NULL,codice,NULL);
pthread_join(t1, (void*) &risultato);
printf("dado estratto: %d",*risultato);
return 0;
它在以下行返回错误:pthread_join(t1, (void*) &risultato);
。
错误是:
[错误] 从 'void*' 到 'void**' 的无效转换 [-fpermissive]
我该如何解决这个错误?
【问题讨论】:
这看起来更像c
而不是c++
。
恢复了标签编辑——错误信息表明 OP 正在使用 C++ 编译器
@M.M 那是我的错误;感谢您纠正我
【参考方案1】:
这段代码是错误的:
int *risultato=0;
...
pthread_join(t1, (void*) &risultato);
prototype for pthread_join()
是:
int pthread_join(pthread_t thread, void **value_ptr);
请注意,它是void **
。那是因为用于启动线程的函数返回一个void *
。为了能够访问线程启动函数返回的void *
,您需要传递一个void *
的地址,以便pthread_join()
可以填写值:
void *risultato=0;
...
pthread_join(t1, &risultato);
注意risultato
现在是正确的void *
,它的地址通过使用&
“address-of”运算符传递给pthread_join()
。
要从 codice()
函数返回 int
返回值:
int *intPtr = ( int * ) risultato;
int value = *intPtr;
【讨论】:
我试过了,但即使在这种情况下,就像我在另一个答案的评论中所说的那样,输出很奇怪【参考方案2】:第二个参数的类型应该是void**
。
这是你应该做的:
void *risultato_voidp;
pthread_join(t1, &risultato_voidp);
resultato = static_cast<int*>(risultato_voidp);
完整示例:
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include <time.h>
#include <errno.h>
#define TANTI 10
int parametroOUT;
void* codice(void *arg)
srand(time(NULL));
parametroOUT=(rand()%6)+1;
pthread_exit(static_cast<void*>(¶metroOUT));
int main()
int dadoEstratto, *risultato=0;
void *risultato_voidp;
pthread_t t1;
int er;
if(0!=(er=pthread_create(&t1,NULL,codice,NULL))) return errno=er,perror(0),1;
pthread_join(t1, &risultato_voidp);
risultato = static_cast<int*>(risultato_voidp);
printf("dado estratto: %d\n",*risultato);
return 0;
【讨论】:
它返回这个错误:[Error] cast from 'void*' to 'int' lost precision [-fpermissive] in the int resultato=(int) risultato_voidp; 它可以工作,但它给了我一个奇怪的值输出应该是 1 到 6 之间的数字,但输出是这个 0 4254373 没什么,我完全复制了你做的例子,但输出是一样的 @GabrieleSantoro 它“工作正常”。这是一个奇怪的例子。你可以在加入后打印parametroOUT
,因为它是一个全局的,而忘记通过pthread_exit()
传递任何东西。
我明白了,我没想过要把印刷品放在空白处。在某种意义上它是有帮助的,但我不明白为什么它把这个数字作为输出而不是 1 到 6 之间的数字。有什么问题?【参考方案3】:
我通过制作这个简单的功能解决了我的问题,感谢所有帮助我的人
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include <time.h>
#define TANTI 10
int dadi[TANTI];
int i=0;
void* codice(void *arg)
while(i<TANTI)
srand(time(NULL);
dadi[i]=rand() % 6 + 1;
printf("il dado estratto e': %d\n",dadi[i]);
i++;
pthread_exit(0);
int main()
int dadoEstratto;
pthread_t t1;
pthread_create(&t1,NULL,codice,NULL);
pthread_join(t1,NULL);
return 0;
【讨论】:
以上是关于为啥 pthread_join 会出现此错误? [错误] 从 'void*' 到 'void**' 的无效转换 [-fpermissive]的主要内容,如果未能解决你的问题,请参考以下文章