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

C++ Discussion :

implementer un semaphore avec un mutex et une condition


Sujet :

C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut implementer un semaphore avec un mutex et une condition
    Bonjour,

    J'aurais voulu avoir votre opinion sur "comment implementer un semaphore en utilisant un mutex et une condition" avec pthread ?

    Je sais que pthread possede deja des semaphores, mais j'aimerais en re-implementer un (pour le sujet [MT] Benchmark de produits matriciels sur processeurs multi-cores )

    en gros, pthread est mal foutu pour mac et n'implemente pas ce qu'il faut pour faire des semaphores (en fait que ceux inter-processus et sont forcement nommés)

    donc l'idée serait de reimplementer un count semaphore...

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    class semaphore
    {
      private:
    	int count;
            mutex mut;
    	condition cond;
     
        semaphore(const self &);
        const self &operator=(const self &);
     
      public:
        inline semaphore(     ) { count = 1;  }
        inline semaphore(int n) { count = n; }
        inline ~semaphore() {}
     
        inline void release() { 
    		mut.acquire();
    		count = count + 1;
    		cond.signal();
    		mut.release();
    	}
     
        inline void release(int n) { for (int i=0; i<n; ++i) release(); }
     
        inline void acquire() {
    		mut.acquire();
    		assert(count >= 0);
    		while(count == 0)  
                cond.wait(mut);
    		count = count - 1;
    		mut.release();
    	}
     
        inline void acquire(int n) { for (int i=0; i<n; ++i) acquire(); }
     
        inline bool try_acquire()      { mutex::scoped_lock lock(mut); return count > 0; }
        inline int  try_acquire(int n) { mutex::scoped_lock lock(mut); return count > n ? n : count; }
    };
    êtes-vous d'accord ? (pthread est utilisé sous la couche d'abstraction)

    je ne pense pas que le code soit bon pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inline void acquire(int n) { for (int i=0; i<n; ++i) acquire(); }
    http://www.developpez.net/forums/sho...&postcount=177

    imaginons 2 threads qui se dispute 10 resources (semaphore) si chacun des threads en veut 8, he bien il y a blocage pur et simple parce que ils se seront alloués chacun 5 resources par exemple ....
    il vaudrait mieux faire acquerir n resources ou rien...

    Qu'en pensez-vous ?

    Merci d'avance pour vos conseils,
    a+

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Les opérations sur sémaphores (acquire et release) doivent par définition être atomiques, ce qui n'est pas le cas avec les implémentations d'acquire (int n) et release (int n) que tu proposes, donc ça ne peut pas marcher.

    Si tu veux te baser sur l'utilisation des acquire et release, je vois que deux solutions :

    - la première, utiliser un mutex réentrant, et acquérir le mutex en début de ta fonction acquire(int n) avant d'appeler la fonction acquire simple.

    - la seconde, définir une fonction acquire (int n=1) (resp release(int n=1)) qui se charge d'incréementer (resp décrémenter) le compteur du nombre de ressources adéquates.

    Il me semble cependant me souvenir qu'il ne faut pas modifier le compteur d'une sémaphore autrement que par incrémentation ou décrémentation simple, mais je n'arrive plus à remettre la main sur l'article :/

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419

  4. #4
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    A noter que le V() d'un semaphore n'a normalement pas besoin d'être ni atomique, ni mutually-exclusive.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    c'est quoi le V() ?

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Nicroman t'en dira sûrement plus.
    Je sais juste que les fonctions P et V sont à la base de la programmation multi-processus.
    La fonction P demande un ticket, la fonction V donne un ticket.
    Si je me souviens bien, c'est des initiales de mots hollandais! Mais petit moyen mnémotechnique: P=Puis-je passer? V=Vas-y!

    En pratique je crois que ça ne sert pas à grand chose puisque les bibliothèques offrent un minimum d'encapsulation.

  7. #7
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    P() et V() sont les deux noms classiques donnés aux deux fonctions d'un sémaphore....
    Dijkstra étant néérlandais, il a utilisé les fonctions "Proberen" (tester) et "Verhogen" (incrémenter) pour la définition des sémaphore... et c'est resté. Dans tous les cours d'informatique tu verras P() et V().

    Si tu veux un moyen mnémotechnique facile tu peux dire "Puis-je()" et "Vas-y()"

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    mais en fait j'utilisais cette notation en cours, mais ca fait longtemps et je ne me rappelais plus. Je m'en suis juste souvenu quand vous me l'avez expliqué

    Merci pour l'explication

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. implementer un tableau avec une boucle for
    Par shimomura22 dans le forum C#
    Réponses: 14
    Dernier message: 14/01/2011, 16h22
  2. Réponses: 9
    Dernier message: 08/11/2007, 13h33
  3. Problème avec un LIKE dans une procédure stockée
    Par Oluha dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/12/2004, 14h38
  4. Fusionner 3 requêtes avec un SUM en une seule
    Par David Guillouet dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/07/2004, 15h54

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