• [^] # Re: explication sommaire

    Posté par . En réponse au message petite question..... Évalué à 3.

    Ok, et cet exemple là ça marche aussi: ?


    #include <pthread.h>

    int running = 1;

    void* thread_1(void* p)
    {
    int a = 0,c = 1;

    while(running) {
    //printf("thread : salut\n");
    //sleep(2);
    a++;
    c = a * c * c;
    }
    printf("thread : ok d'accord, c = %d...\n",c);
    }

    int main()
    {
    pthread_t* t;
    t = (pthread_t*)malloc(sizeof(pthread_t));;
    pthread_create(t,NULL,thread_1,NULL);
    sleep(10);
    printf("main : bon tu t'arretes maintenant!\n");
    running=0;
    sleep(100);
    }


    Compilé avec -O3.

    Extrait du code assembleur généré (rajouter l'option -S sur la
    ligne de commande de gcc):


    .globl thread_1
    .type thread_1, @function
    thread_1:
    pushl %ebp
    xorl %ecx, %ecx
    movl %esp, %ebp
    pushl %ebx
    movl 1,ドル %edx
    subl 20,ドル %esp
    movl running, %ebx
    testl %ebx, %ebx
    je .L8
    .p2align 4,,15
    .L6:
    incl %ecx
    movl %ecx, %eax
    imull %edx, %eax
    imull %eax, %edx
    testl %ebx, %ebx
    jne .L6
    .L8:
    movl %edx, 4(%esp)
    movl $.LC1, (%esp)
    call printf
    addl 20,ドル %esp
    popl %ebx
    popl %ebp
    ret


    On voit ici que la boucle, située entre .L6 et .L8 ne recharge PAS
    le contenu de la variable running.

    Donc, ne pas faire de généralisation abusive à partir d'un seul
    exemple.