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

MFC Discussion :

[CSemaphore] pourquoi ca me bloque pas ?


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut [CSemaphore] pourquoi ca me bloque pas ?
    hello,

    j utilise un Csemaphore pour gerer la concurrence entre 2 thread.

    dans le premier thread, j initialise le compteur du semaphore à 1 et le nombre max à 1. (de manière à ce qu il soit non bloquant au debut et que 1 seul thread puisse etre à la fois dans le sem.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_pSem = new CSemaphore(1,1);
    ensuite je bloque le semaphore dans une boucle de manière à ce que l itteration suivante soit precedée d une action d un autre thread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    do{
    CSingleLock l_Locker(m_pSemStopInstance);				
    l_Locker.Lock();
    envoie d un signal à l autre thread;
    }while(....);
    et evideament, apres reception du signal dans l autre thread je debloque le semaphore pour permettre au thread 1 de continuer avec son iteration 2 de la boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    reception du signal;
    traitement;
    CSingleLock l_Locker(m_pSem);				
    l_Locker.Unlock();
    Le problème est que dans le thread 1 ( le premier), le deuxième passage sur le lock() n est pas bloquant, alors que le thread 2 n'as pas encore fais le unlock() ???

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Le sémaphore est délocké et relocké à chaque itération : C'est à ça que sert CSingleLock, le verrou RAII...

    De plus, ton utilisation me parait fort inappropriée pour un sémaphore, et relever plutôt d'un événement (CEvent)...
    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 ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    Citation Envoyé par Médinoc
    Le sémaphore est délocké et relocké à chaque itération : C'est à ça que sert CSingleLock, le verrou RAII...
    oui et alors ? je comprend pas le but de cette remarque...

    Citation Envoyé par Médinoc
    De plus, ton utilisation me parait fort inappropriée pour un sémaphore, et relever plutôt d'un événement (CEvent)...
    certe, mais cependant elle doit quand meme fonctionner

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Oups! J'ai mal lu.

    Edit: Aie! Cette partie est fausse:
    Donc, tu réserves un sémaphore dans un thread et tu tentes de le faire libérer par un autre ---> Echec: La réservation est locale à un thread. Le second thread ne peut rien libérer du tout, puisqu'il ne possède pas l'unité.
    Et avec un mutex, ça foirerait pareil.
    Edit: La bonne raison de l'échec, c'est que tu utilises des CSingleLock sur ton sémaphore alors que ce n'est pas approprié ici. Un CSingleLock ne libère que ce qu'il a lui-même acquis, et le libère en toutes circonstances lors de sa desctuction. C'est une classe RAII, il sert à ça.
    Avec un CSingleLock mutex, ça foirerait pareil.


    Avec un event (et surtout pas de CSingleLock) ça devrait mieux passer...
    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.

  5. #5
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    Bon avec les CEvent ca marche impec !

    Mais je reste decu par l implementation des CSemaphore. Ils ne se comportent pas du tout comme la definition générale du Sémaphore (cf. [Dij 68], E.W.Dijkstra --> quel Winner cet Edsger)

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    En fait, je me suis trompé. L'implémentation est bonne, et il semblerait qu'un thread peut incrémenter un sémaphore même s'il ne l'a pas.

    Par contre, pour cela il ne faut pas utiliser CSingleLock. CSingleLock est une classe RAII dédiée pour réserver une ressource et la rendre, et cette classe-ci s'assure de ne pas libérer ce qu'elle n'a pas.

    En utilisant directement les fonctions de CSemaphore sans CSingleLock, ça aurait sûrement marché.
    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.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/04/2006, 15h54
  2. Pourquoi ce code marche pas sous FF?
    Par Death83 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 09/09/2005, 10h04
  3. [W3C] Pourquoi ça ne marche pas sous IE
    Par polo-j dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 16/02/2005, 16h07
  4. Pourquoi je n'ai pas le droit à un bootsplash ?
    Par Michaël dans le forum Administration système
    Réponses: 4
    Dernier message: 30/08/2004, 14h02
  5. [C#] Pourquoi je ne peux pas sauvegarder le fichier Xml ?
    Par gregoun dans le forum Services Web
    Réponses: 5
    Dernier message: 05/05/2004, 10h00

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