2 votes

Questions sur la fonction pthread_join

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>

void* thread_function(void *ignoredInThisExample)
{
    char *a = malloc(20);
    strcpy(a,"hello world");
}

int main()
{
    pthread_t thread_id;
    char *b;

    pthread_create (&thread_id, NULL,&thread_function, NULL);

    pthread_join(thread_id,(void**)&b); //here we are reciving one pointer
                                        //value so to use that we need double pointer
    printf("b is %s.\n",b);

    return 0;
}

en utilisant -O0 y -O1 à compiler et à exécuter :

[root c++]#gcc -g -O0 -o pthread pthread.c -lpthread
[root c++]#
[root c++]#
[root c++]#./pthread
b is hello world.
[root c++]#
[root c++]#
[root c++]#gcc -g -O1 -o pthread pthread.c -lpthread
[root c++]#
[root c++]#./pthread
b is .

pourquoi cela se produit-il ? code source de pthread_join() et pthread_exit() Comme je ne suis pas familier avec le langage assembleur, quelqu'un peut-il m'aider à analyser la raison ? assemblage en ligne

4voto

Holeryn Points 307

Si vous ne renvoyez rien à l'intérieur de votre thread_function est un UB, avec -O0 le compilateur résout automatiquement ce problème. En fait, votre fonction est :

thread_function:
      push    rbp
      mov     rbp, rsp
      sub     rsp, 32
      mov     QWORD PTR [rbp-24], rdi
      mov     edi, 20
      call    malloc
      mov     QWORD PTR [rbp-8], rax
      mov     rax, QWORD PTR [rbp-8]
      movabs  rdx, 8031924123371070824
      mov     QWORD PTR [rax], rdx
      mov     DWORD PTR [rax+8], 6581362
      nop
      leave
      ret

Cependant, lorsque vous compilez avec -O1 , votre fonction est :

thread_function:
        ret

De plus, si vous ne connaissez pas l'Assemblage, vous pouvez comprendre que cette procédure renvoie simplement sans rien faire mais si vous ajoutez return a; à la fin de votre thread_function votre fonction devient :

thread_function:
      sub     rsp, 8
      mov     edi, 20
      call    malloc
      movabs  rdx, 8031924123371070824
      mov     QWORD PTR [rax], rdx
      mov     DWORD PTR [rax+8], 6581362
      add     rsp, 8
      ret

Maintenant, si vous exécutez le programme, la sortie est correcte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X