IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Embarqué Discussion :

Synchronisation de tâches (sémaphores)


Sujet :

Embarqué

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Synchronisation de tâches (sémaphores)
    Bonjour à tous,

    Je dois coder un petit programme ayant les consignes suivantes :

    Réalisez la synchronisation de ces 3 tâches :

    Tâche T1 : doit créer un tableau n°1 de données (random de int de 1 à 10) et s'endort 100ms
    Tâche T2 : lit le tableau n°1, en récupérant que les données int <5 et les recopie dans un autre tableau n°2 . Puis elle s'endort 200ms.
    Tâche T3 : affiche le tableau 2 à l'écran quand la tâche T2 a terminé.

    Donc j'en déduis que l'on doit recevoir des données avec T1 avant de pouvoir lancer T2.

    Je pense réaliser cette synchronisation qu'avec 3 sémaphores :

    Semaphore Stableau1, Stableau2 : qui protègent en mutex les tableaux 1 et 2
    Semaphore Safficher : qui lance l'affichage que si T2 est fini.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    tâches T1 (){
    
    Pour tout le tableau1 
      P(Stableau1);
      tableau1 := données de 1 à 10;
      V(Stableau1);
    Fin pour.
    }

    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
    tâches T2 (){
    
    P(Stableau2);
    P(Stableau1);
    
    Pour tout le tableau 2
      tableau2 := les données du tableau1 qui sont < à 5
    Fin pour.
    
    V(Stableau2);
    V(Stableau1);
    
    
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    tâches T3 (){
    
    P(Safficher);
    P(Stableau2);
    
    Pour tout le tableau 2
      tableau2 := les données du tableau1 qui sont < à 5
    Fin pour.
    
    V(Safficher);
    V(Stableau2);
    
    }

    Que pensez-vous de mon raisonnement ? Est ce que j'utilise correctement les sémaphores ? Est ce qu'il n'y aura pas des problèmes car T1 et T2 s'endorment ?

    Merci de votre aide

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    1
    Par défaut
    J'en pense qu'on dirait mes exos de temps réel d'école

    J'en pense aussi que :

    • le sémaphore d'affichage n'est pris que par T3 et ne sert donc à rien. T2 n'indique pas qu'elle a fini sa tâche.
    • la prise et le relâchement dans T1 doivent se faire hors de la boucle
    • 2 sémaphores ne pourraient pas être suffisants ? (*)
    • tu ne risques pas de problème avec T1 et T2 car ils ne prennent pas exactement tous les mêmes sémaphores, pas de risque d'interblocage donc.
    • ce sont des mutex plus que des sémaphores.


    (*)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    T1()
    {
        P(mutex_tableau_1)
        Ecrire()
        V(mutex_tableau_1)
        Dodo()
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    T2()
    {
        P(mutex_tableau_2)
        P(mutex_tableau_1)
        Travailler()
        V(mutex_tableau_1)
        Dodo()
        V(mutex_tableau_2)
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    T2()
    {
        P(mutex_tableau_2) // si on y arrive, cela signifie que T2() est terminee
        Afficher()
        V(mutex_tableau_2)
    }

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Mille merci pour ta réponse !!!

    Il y a juste quelque chose que je ne comprends pas.
    Comment faire pour que la tâche T3 s'exécute uniquement QUE si T2 a fini ?
    C'est pour cela que j'avais mis un sémaphore "Safficher" afin qu'il lance T3 que si la fonction V du semaphore dans T2 est activé;

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    1
    Par défaut
    Pour être exact, tu souhaites que T3 ne s’exécute qu'une seule fois après la modification par T2 du graphique ; et non "en permanence" dés que le mutex est libre ?

    Si oui, défini une variable globale, par exemple un booléen : nouvellesDonnees. T2 le met à True quand il modifie le tableau 2, à l'intérieur de la section critique de mutex_tableau_2. T3 entre dans la section critique de mutex_tableau_2 de manière cycliquement et regarde l'état de nouvellesDonnees.
    • Si nouvellesDonnees == False, alors elle n'y a rien à faire et T3 se termine en relâchant le mutex.
    • Si nouvellesDonnees == True, alors elle affiche les données, repasse cette variable à False, libère le mutex et se termine.



    Tu pourrais aussi utiliser un sémaphore nouvellesDonnees pour implémenter une sorte de signal. T3 vient se mettre en atteinte d'un jeton de ce sémaphore. Lorsque T2 a fini la mise à jour du tableau, il crée un jeton de ce sémaphore. Pas la peine de le relâcher, surtout si T3 est une tâche cyclique, sinon il pourra re-consommer le jeton qu'il vient de libérer.


    En fait, je m'étais basé sur des tâches cycliques et j'avais un peu simplifié ton raisonnement. Au temps pour moi !

Discussions similaires

  1. [Débutant] synchroniser 2 tâches ?
    Par cesar333 dans le forum VB.NET
    Réponses: 9
    Dernier message: 07/08/2011, 19h08
  2. Synchronisation de tâche
    Par greg08 dans le forum Langage
    Réponses: 6
    Dernier message: 08/09/2008, 17h25
  3. Réponses: 11
    Dernier message: 23/05/2007, 10h14
  4. Réponses: 12
    Dernier message: 18/05/2007, 11h34
  5. Synchronisation de tâches
    Par Laverdure_mt dans le forum Access
    Réponses: 1
    Dernier message: 21/12/2006, 09h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo