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 :

tester un mutex


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 80
    Par défaut tester un mutex
    bonjour,
    je cherche a tester si un mutex fonctionnent correctement, voici la fonction qui l'utilise

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    EUpdateResult RulesDataMapper::update(const bool statement){
    	lock.lock();
    ...
        lock.unlock();
        return result;
    }
    cette fonction se situe dans la classe RulesDataMapper que je souhaite tester
    j'ai alors un autre classe RulesDataMapperTest pour cela
    pour l'instant voici la code que j'ai mais qui ne marche pas ça me génère un erreur

    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
    TEST_F(RulesDataMapperTest, testMultiThreadingResistance){
            std::thread thread1(r1->update(true));
    ...
    ERREUR 
    In file included from /usr/include/c++/5/mutex:42:0,
                     from /home/charles/Desktop/Westguard-SSM/src/test/../Controller/../DataMapper/RulesDataMapper.h:25,
                     from /home/charles/Desktop/Westguard-SSM/src/test/../Controller/EvaluateController.h:16,
                     from /home/charles/Desktop/Westguard-SSM/src/test/EvaluateControllerTest.h:9,
                     from /home/charles/Desktop/Westguard-SSM/src/test/AllTest.cpp:10:
    /usr/include/c++/5/functional: In instantiation of ‘struct std::_Bind_simple<EUpdateResult()>’:
    /usr/include/c++/5/thread:137:59:   required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = EUpdateResult; _Args = {}]’
    /home/charles/Desktop/Westguard-SSM/src/test/RulesDataMapperTest.h:598:75:   required from here
    /usr/include/c++/5/functional:1505:61: error: no type named ‘type’ in ‘class std::result_of<EUpdateResult()>’
           typedef typename result_of<_Callable(_Args...)>::type result_type;
                                                                 ^
    /usr/include/c++/5/functional:1526:9: error: no type named ‘type’ in ‘class std::result_of<EUpdateResult()>’
             _M_invoke(_Index_tuple<_Indices...>)
    ma queston est donc la suivante es ce que pour tester un mutex on dois passer pas différent thread que l'on dois exécuter en même temps ? si oui comment créer un thread ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Salut,

    Un mutex sert à bloquer un thread/une opération.
    Si tu n'as qu'un seul thread, tu vas vouloir bloquer ton unique thread pendant que... rien du tout, tu n'as aucun autre thread. Donc oui faut au moins 2 thread pour qu'un mutex ait quelconque utilité
    Si tu veux tester qu'un mutex est lockable, il y a try_lock.
    Si tu veux tester qu'un mutex "fonctionne".. euh compte juste sur l'implémentation pour être correcte.

    Vues tes erreurs, ton code ne semble pas compiler.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 80
    Par défaut
    merci pour la reponse,

    Si tu n'as qu'un seul thread, tu vas vouloir bloquer ton unique thread pendant que... rien du tout, tu n'as aucun autre thread. Donc oui faut au moins 2 thread pour qu'un mutex ait quelconque utilité
    je n'ai mit qu'un seul thread dans mon exemple c'est vrais mais de toute façon il me généré une erreur lors de la compilation donc un ou deux pas de différence, mais dans mon code final bien sur qu'il y a deux thread, du coup comment déclare t'on un thread j'ai essayer plusieurs méthode mais aucune n'a fonctionner

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Non, il n'y pas un mais deux threads dans ton exemple, car un thread est créé (par le thread principal). On peut donc "jouer" avec les mutex.

    Pour créer un thread, il faut lui passer une fonction à exécuter. Il ne faut pas lui passer le résultat d'un appel de fonction.
    On peut remplacer std::thread thread1(r1->update(true)); par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::thread thread1( [&]() { return r1->update(true); } );     // dérouler la fonction comme étant un thread

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    EUpdateResult RulesDataMapper::update(const bool statement){
    	lock.lock();
    ...
        lock.unlock();
        return result;
    }
    Bonjour,

    Quand tu auras résolu tes erreurs de compilation, tu pourras regarder lock_guard qui devrait te permettre de simplifier ta gestion des lock/unlock de ton mutex : http://en.cppreference.com/w/cpp/thread/lock_guard

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 80
    Par défaut
    merci beaucoup de votre aide et conseille j'ai réussis a faire marcher mon teste comme je le voulais

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 636
    Par défaut
    Salut,

    Ceci étant dit: le simple fait de vouloir utiliser des mutexes peut souvent être considéré comme le symptôme d'un mal beaucoup plus grave: le fait que, à un moment ou à un autre, on voudra empêcher un thread particulier d'accéder à certaines données dont il semble avoir besoin.

    L' *** idéal *** étant de faire en sorte que chaque thread puisse manipuler "à son aise" ses "propres données" sans avoir à s'inquiéter du fait qu'il puisse y avoir "un autre thread" qui tente d'y accéder.

    Et pour arriver à ce résultat, l'idéal est -- bien sur -- de faire en sorte que chaque thread se contente de manipuler "ses données à lui".

    Nous sommes tous, bien sur, tout à fait conscients du fait que "c'est parfois vachement dur", et qu'il arrive même que "ce soit à peu près impossible".

    Mais il faut comprendre que l'utilisation de threads n'aura réellement un intérêt que si chaque thread peut travailler "à son aise" sans avoir besoin d'attendre... qu'un autre thread ait libérer "une donnée" pour pouvoir y accéder.

    Pire encore : dans certains cas particuliers, on peut se trouver confrontés à deux threads dont un "verrouille l'accès" à une donnée alors que l'autre a déjà eu "l'autorisation de principe" d'y accéder. Et cela occasionne un blocage mutuel des threads appelé "death lock".

    Alors bon... je ne met nullement en doute ton besoin d'avoir recours à des threads. Je peux comprendre que tu aies peut-être besoin de mutexes. Mais si j'ai un conseil d'ami à te donner, c'est bien d'essayer... de tout faire pour t'en passer
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Tester si un mutex est bloqué
    Par Flo. dans le forum Boost
    Réponses: 7
    Dernier message: 13/09/2012, 16h03
  2. tester si une date est valide
    Par Andry dans le forum Langage
    Réponses: 5
    Dernier message: 17/09/2002, 11h54
  3. [VB6] [Interface] Tester le Type de Controle
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 16/09/2002, 09h51
  4. [ADO] Tester l'existence d'une table
    Par nd25 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 05/09/2002, 13h55
  5. Tester connexion Internet active sous Windows
    Par Altau dans le forum Développement
    Réponses: 3
    Dernier message: 12/08/2002, 12h43

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