Bonjour,

Je voulais tester la librairie pthread alors j'ai écris un petit bout de code en m'inspirant des différents tutoriaux disponibles sur le net.
Il s'agit simplement d'afficher pendant une boucle for la vitesse d'itération par seconde du processeur.

Avec le code ci-dessous, je constate dans le gestionnaire des tâches que le RAM utilisée par le programme augmente au fur et à mesure du temps et se libère à la fin de la boucle à environ 60Mo de RAM pour une itération stable de 35000 itérations/s.

Si dans la fonction task ci dessous, je dé commente la ligne qui permet de n'afficher le résultat que tout les 10% de progression alors cette fois ci la RAM va arriver à saturation très rapidement de 0 à 8Go et la vitesse d'itération elle va décroître dans le temps au fur et à mesure que la RAM elle augmente.

Visiblement, il y a quelque chose dans le concept du thread que je n'ai pas compris.
Est-ce que quelqu'un est en mesure de m'expliquer ce que je ne fais pas correctement parce que là je sèche total ?

Merci d'avance pour votre aide.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
static void *task (void *p_data)
{
   if (p_data != NULL)
   {
        double *s = p_data;
 
        //if ( s[3]==1 )
            printf("\n iteration/s = %.2f --- progress %.0f %%", s[4], 100*s[1]);
 
        pthread_exit(NULL);
        free(s);
   }
   return NULL;
}
 
int main(int argc, char *argv[], char* env[])
{
    system("title Library");
    system("mode con cols=150 lines=75");
 
    if (logger_on()==TRUE)
    {
        pthread_t t;
 
        double *p = allocate_1D_d(5);
        p[0] = GetTickCount();
        p[1]=0;
        p[2]=0.1;
 
        int i = 0;
        for ( i = 0 ; i<INT_MAX/1000 ; i++ )
        {
            p[1]=1000.*i/INT_MAX;
            p[4] = 1000.*i/(GetTickCount()-p[0]);
 
            if ( p[1] >= p[2] )
                p[2] += 0.1, p[3]=1;
 
            else p[3]=0;
            pthread_create (&t, NULL, task, (double*)p);
 
        }
        free(p);
        pthread_join (t, NULL);
}