Problème de threads

Fermé
jacky - Modifié le 16 mars 2022 à 16:05
 pthread - 13 mars 2022 à 13:02
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)
  }
A voir également:

2 réponses

mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
Modifié le 13 mars 2022 à 12:51
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
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