Problème de threads

jacky -  
 pthread -
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. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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
    0
  2. pthread
     
    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.
    0