2010-10-13 5 views
3

Je suis novice en programmation Linux.Erreur de retour de valeur pthread

Je renvoie une valeur du thread. Mais lorsqu'il est compilé, il énumère quelques erreurs. Je liste le code et l'erreur ci-dessous. S'il vous plaît aidez-moi à comprendre pourquoi l'erreur et comment la résoudre.

Code

#include <pthread.h> 
#include <stdio.h> 
void* compute_prime (void* arg) 
{ 
     int x = 2; 
     return (void*) x; 
} 


int main() 
{ 
     pthread_t thread; 
     int prime; 
     pthread_create (&thread, NULL, &compute_prime, NULL); 
     pthread_join (thread, (void*) &prime); 
     printf("The returned value is %d.\n", prime); 
     return 0; 
} 

erreur

$ g++ -othj pdfex.cpp -lpthread 
pdfex.cpp: In function `int main()': 
pdfex.cpp:17: error: invalid conversion from `void*' to `void**' 
pdfex.cpp:17: error: initializing argument 2 of `int pthread_join(pthread_t, void**)' 

Qu'est-ce que je fais mal?

+0

Essayez reposting et en utilisant le bouton de formatage du code pour les sections de code, sinon le formatage sera désactivé. – shuttle87

Répondre

1

pthread_join() demande un void**, et vous lui donnez un void*.

+0

oh mon dieu tu ne peux pas être sérieux! rofl – snr

4

Depuis la déclaration de pthread_join() est:

int pthread_join(pthread_t thread, void **value_ptr); 

votre casting « (void *) » est faux - et le compilateur vous dit que.

Comment réparer?

  • Si sizeof(void *) == sizeof(int) sur votre machine, puis:

    pthread_join(thread, (void **)&prime); 
    
  • Sinon:

    uintptr_t uip; 
    pthread_join(thread, (void **)&uip); 
    prime = uip; 
    

    Cela nécessite #include <stdint.h> (ou #include <inttypes.h>), et exploite le fait qu'un uintptr_t est le même taille comme void *.


Ce code délivre la réponse 2 lors de la compilation de 64 bits sur MacOS X 10.6.4 (qui correspond à la clause 'normalement'):

#include <pthread.h> 
#include <stdio.h> 
#include <inttypes.h> 
#include <assert.h> 

static void *compute_prime(void* arg) 
{ 
    uintptr_t x = 2; 
    assert(arg == 0); 
    return (void *)x; 
} 

int main(void) 
{ 
    pthread_t thread; 
    uintptr_t prime; 
    pthread_create(&thread, NULL, &compute_prime, NULL); 
    pthread_join(thread, (void **) &prime); 
    printf("The returned value is %" PRIuPTR ".\n", prime); 
    return 0; 
} 
+0

MERCI POUR LA RÉPONSE UR. IL AIDERA MOI À RÉSOUDRE LES ERREURS – Thanseer

+0

@Thanser vous devriez accepter –

+1

@Foo Bah: merci, mais c'est une cause perdue; Thanseer a été vu pour la dernière fois le 2010-10-15. –