为什么 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*)&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;                                           
}

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*>(&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;
}

这段代码是错误的:

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;           
  }