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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �m�rite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    D�tails du profil
    Informations personnelles :
    �ge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    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 chevronn�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : France, Paris (�le de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    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 �m�rite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    D�tails du profil
    Informations personnelles :
    �ge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354

  4. #4
    Expert confirm�

    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
    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 �m�rite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    D�tails du profil
    Informations personnelles :
    �ge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    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
    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.

+ 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