为啥 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*)&parametroOUT);


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*) &amp;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 *,它的地址通过使用&amp;“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*>(&parametroOUT));

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]的主要内容,如果未能解决你的问题,请参考以下文章

数组定义错误:为啥会出现此错误?

为啥会出现此资源找不到错误消息?

为啥此代码会出现 -fpermissive 错误?

为啥 Corona sdk 中会出现此错误?

为啥使用 SingleAsync 时会出现此错误?

为啥 pthread_join() 的第二个参数是一个**,一个指向指针的指针?