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

Windows Discussion :

Synchronisation de threads - Sémaphore, Mutex ou SRWLock ?


Sujet :

Windows

  1. #1
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut Synchronisation de threads - Sémaphore, Mutex ou SRWLock ?
    Bonjour,

    Voila, j'ai une appli qui tourne avec plusieurs threads.

    Ces differents threads se partagent des données.

    Tous les threads accedent en lecture à ces données.
    Tous les threads, sauf 1 qui est spécial accedent aussi en ecriture.

    Voila mon probleme :

    Le thread qui n'accedent qu'en lecture est le moteur principal du logiciel, il doit donc pouvoir s'executer le plus rapidement possible.

    Les autres threads peuvent se permettre d'attendre un peu, c'est pas genant.

    Je pense faire un truc du genre :

    Acces en lecture :
    - tant qu'une ecriture n'est pas en attente, on autorise la lecture.
    - pendant la lecture, on interdit l'ecriture.

    Acces en ecriture :
    - on fait une demande d'ecriture (qui va bloquer les fonctions de lecture)
    - on attend que toutes les lectures en cours soient terminées
    - on ecrit
    - on debloque la lecture

    Vu que les performances du thread principal (que lecture) sont essentielles dans ce projet, quel objet de synchronisation utiliser ?

    J'ai pensé à "Slim Reader/Writer (SRW) Locks" : http://msdn2.microsoft.com/en-us/library/aa904937.aspx

    D'après la doc, c'est le plus rapide, mais je ne sais pas trop comment l'utiliser...

    Des idées ?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Normalement, les SRW locks sont l'idéal.
    Mais si tu veux que ton application puisse tourner ailleurs que sous Vista, tu oublies.

    J'ai bien peur que tu doives implémenter ton propre verrou lecteurs/écrivain (sans doute à base de sémaphores et d'events), ou peut-être un truc dont l'écriture serait plus atomique, avec un double-buffer en prime...

    Enfin, sans le SRWLock, ça ne va pas être facile.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Les SRWLock c'est que sous Vista ?

    Arg !

    Tant pis, je vais me remonter les manches...

    Merci !

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Jette un oeil aux sections critiques. Ce ne sont pas des objets kernel et sont donc plus performants (c'est fait pour la synchro inter-thread).
    http://msdn2.microsoft.com/en-us/library/ms682530.aspx
    En fonction de comment tu modifies la donnée, tu peux aussi jeter un oeil aux API InterlockedXXX:
    http://msdn2.microsoft.com/en-us/library/ms684122.aspx
    qui te garantissent une modif atomique d'une variable.

  5. #5
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Rien n'indique qu'une section critique va permettre a la tache principale d'acceder a la zone critique en priorité si ? Ou alors voila comment je penserais faire a priori :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SecCritique1
    SecCritique2
    Evenement1
    Pour les threads secondaires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SecCritique1.entrer();
    Evenement1.attendre();
    SecCritique2.entrer();
    
    (...)
    
    SecCritique2.sortir();
    SecCritique1.sortir();
    Pour la tache principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Evenement1.designaler();
    SecCritique2.entrer();
    Evenement1.signaler();
    
    (...)
    
    SecCritique2.sortir();

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    En effet, les sections critiques ne donnent pas de priorité.
    Je pensais plutôt à un truc du genre:
    • Mutex/Section critique pour l'écrivain
    • Événement "pas d'écrivain en attente", "désignalé" par l'aspirant écrivain, et nécessaire pour ouvrir en lecture (priorité à l'écrivain)
    • Ensuite:
      • soit un comptage de lecteurs (InterlockedIncrement() etc.) et un événement "pas de lecteurs",
      • soit, si tu connais le nombre maximum de lecteurs, un sémaphore (et encore, si ça se trouve il n'est même pas nécessaire de connaitre effectivement ce nombre maximal, je ne me souviens plus trop de comment marchent les sémaphores).
    • Edit: Plus peut-être une section critique pour les manipulations, ou un autre événement, enfin un truc supplémentaire pour éviter des "race conditions".
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Un petit ensemble d'algos que j'espère à l'épreuve des "race conditions" :
    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
    Réservation en lecture:
    	attend l'événement "pas d'écrivain" (priorité à l'écrivain)
    	désignale l'événement "pas de lecteurs"
    	ré-attend l'événement "pas d'écrivain"
    	Incrémente nombre de lecteurs 
    Libération en lecture:
    	Décrémente le nombre de lecteurs
    	Si ce nombre est nul, signale l'événement "pas de lecteurs"
    	
    Réservation En écriture:
    	Réserve section critique/mutex "écriture"
    	Désignale l'événement "pas d'écrivain"
    	Faire:
    		attend l'événement "pas de lecteurs"
    	Tant que nombre de lecteurs n'est pas confirmé à zéro
    Libération en écriture:
    	Signale l'événement "pas d'écrivain"
    	Relache section critique/mutex "écriture"
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Merci pour toutes ces réponses, je vais tester un peu tout ça, j'ai pas eu vraiment le temps ce week-end...

  9. #9
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Ma solution n'est pas plus simple ?

  10. #10
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Plus simple, oui, mais j'ai besoin de performances optimales sur ce bout de code (c'est le coeur de mon logiciel, et il doit tourner en "quasi-temps-réél")

    Donc j'aimerais éviter autant que possible de faire appel à plusieurs objets de synchro inter-thread.

    En fait, j'ai modifié mon architecture, et ça me complique un poil le code par endroit, mais si je m'y prend bien, les threads n'auront pas besoin d'être synchronisés, car en utilisant plusieurs buffers, chaque thread ne fait que lire et ecrire sur son propre buffer.

    J'y perds un peu en mémoire, mais pas des masses, et si mes tests sont bons j'y gagne presque 50% en temps de traitement !

    Donc à moins d'avoir zappé quelque chose, je devrais m'en sortir comme ça...

    En tout cas, ça ma permis d'apprendre à synchroniser des threads sous windows...

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    NiamorH: Ça dépend de ce que l'on veut.
    Si l'on n'a pas besoin que les lecteurs puissent lire en même temps, on peut utiliser ta méthode (un verrou exclusif avec un membre prioritaire).

    La mienne cherche à implémenter un verrou lecteurs/écrivain complet permettant que plusieurs lecteurs aient accès à la ressource en même temps, mais pour un petit projet ce n'est pas toujours nécessaire...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Ok j'ai mal lu le premier post, je pensais qu'un seul thread principal lisait et que tous les autres ecrivaient.

    Par contre buzzkaido tu vas tout de même devoir synchroniser un peu pour passer les infos d'un thread à l'autre non ?
    Ca depend de comment ton appli fonctionne et de ce que font les threads.

Discussions similaires

  1. Réponses: 13
    Dernier message: 11/06/2015, 16h51
  2. Réponses: 12
    Dernier message: 18/05/2007, 12h34
  3. Question sur la synchronisation des threads.
    Par sebastieng dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 07/12/2005, 16h55
  4. Réponses: 1
    Dernier message: 23/05/2005, 16h52
  5. Synchronisation de thread
    Par declencher dans le forum Langage
    Réponses: 2
    Dernier message: 07/01/2004, 11h28

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