Problème de threads

Bonjour,

J'ai un problème de synchronisation avec ce code.
Qu'est-ce que je dois faire corriger cela ?
Merci

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

int tab_heure[5];

void heure(){ 
  for(;;) {
    tab_heure[0] = (tab_heure[0] + 1) mod 1000;
    if (tab_heure[0] = 0    
    tab_heure[1] = (tab_heure[1] + 1) mod 60;
    if (tab_heure[1] = 0    
    tab_heure[2] = (tab_heure[2] + 1) mod 60;
    if (tab_heure[2] = 0    
    tab_heure[3] = (tab_heure[3] + 1) mod 24;
    if (tab_heure[3] = 0    
    tab_heure[4] = tab_heure[4] + 1; attendre (1 seconde); }
}

main()
{
  pthread_t num_thread;
  if (pthread_create(&num_thread, NULL, (void *(*)())heure, NULL) == -1)
    perror ("pb pthread_create\n");
    for(;;) {
      printf(
        "L’heure du système est : %d jour,%d heure;%d minutes,%d secondes,%d, millisecondes",
        tab_heure[4],
        tab_heure[3],
        tab_heure[2],
        tab_heure[1],
        tab_heure[0]
      )
    };
  attendre (5 secondes)
  }

2 réponses

  1. Plusieurs soucis :

    1) l'heure n'est collectée nulle part.
    2) les composants de l'heure ne sont pas toujours calculés, mais il sont toujours affichés.
    3) les composants de l'heure ne sont pas calculés atomiquement, on peut passer de 14h59 à 14h00 avant d'arriver à 15h00.
    4) la fonction heure calcule en permanence, elle engloutit la puissance de calcul.
    5) une bonne synchronisation serait que l'heure envoie un pthread_cond_signal() quand elle détecte un changement d'heure avec un processus principal qui attend par pthread_cond_wait() pour afficher le changement.
    1. Modérateur
      Bonjour,

      Corrige déjà les erreurs de compilations :
      • Certains parenthèses ne sont pas fermées (voir tes
        if
        )
      • En C, un test d'égalité s'écrit
        ==
      • En C, toute fonction à un type de retour (quitte à ce que ce soit
        void
        ) : ton main devrait retourner un
        int
        (par convention 0 si tout va bien, une valeur non nulle sinon).
      • L'opérateur modulo ne s'écrit pas
        mod
        mais
        %
        .
      • La fonction
        attendre
        n'existe pas. Peut-être voulais-tu utiliser
        sleep
        ?


      Ensuite il y a les erreurs de raisonnement. Ta fonction
      heure
      travaille sur un tableau
      tab_heure
      qui n'est pas initialisé. Son comportement est donc indéterminé. Tous tes threads travaillent sur une structure commune. Tant que cette structure est en lecture seule, ça n'est pas grave, mais sinon il faudrait gérer les accès concurrents, ou avoir une structure par thread.

      J'imagine qu'à un moment tu voudras récupérer l'heure courante, cette page pourrait t'aider.

      Bonne chance