为什么 pthread_join 给出这个错误? [错误] 从 'void*' 到 'void**' 的无效转换 [-fpermissive]
Why the pthread_join is giving this error? [Error] invalid conversion from 'void*' to 'void**' [-fpermissive]
我正在按照我的书关注这个应用程序,我试着复制这个程序,看看它做了什么。
令我大吃一惊的是,我发现它不起作用!!
程序如下:
#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;
}
returns 行错误:pthread_join(t1, (void*) &risultato);
。
错误是:
[Error] invalid conversion from 'void*' to 'void**' [-fpermissive]
我该如何解决这个错误?
第二个参数的类型应为 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;
}
这段代码是错误的:
int *risultato=0;
...
pthread_join(t1, (void*) &risultato);
prototype for pthread_join()
是:
int pthread_join(pthread_t thread, void **value_ptr);
请注意,它是 void **
。那是因为用于启动线程的函数 return 是 void *
。为了能够从thread-start函数访问void *
returned,需要传递一个void *
的地址,这样pthread_join()
就可以填入值了:
void *risultato=0;
...
pthread_join(t1, &risultato);
请注意 risultato
现在是正确的 void *
,它的地址通过使用 &
"address-of" 运算符传递给 pthread_join()
。
要从 codice()
函数返回 int
return 值:
int *intPtr = ( int * ) risultato;
int value = *intPtr;
我通过这个简单的功能解决了我的问题,感谢所有帮助我的人
#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;
}
我正在按照我的书关注这个应用程序,我试着复制这个程序,看看它做了什么。
令我大吃一惊的是,我发现它不起作用!!
程序如下:
#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;
}
returns 行错误:pthread_join(t1, (void*) &risultato);
。
错误是:
[Error] invalid conversion from 'void*' to 'void**' [-fpermissive]
我该如何解决这个错误?
第二个参数的类型应为 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;
}
这段代码是错误的:
int *risultato=0;
...
pthread_join(t1, (void*) &risultato);
prototype for pthread_join()
是:
int pthread_join(pthread_t thread, void **value_ptr);
请注意,它是 void **
。那是因为用于启动线程的函数 return 是 void *
。为了能够从thread-start函数访问void *
returned,需要传递一个void *
的地址,这样pthread_join()
就可以填入值了:
void *risultato=0;
...
pthread_join(t1, &risultato);
请注意 risultato
现在是正确的 void *
,它的地址通过使用 &
"address-of" 运算符传递给 pthread_join()
。
要从 codice()
函数返回 int
return 值:
int *intPtr = ( int * ) risultato;
int value = *intPtr;
我通过这个简单的功能解决了我的问题,感谢所有帮助我的人
#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;
}